根据定义,std::equal 算法只需要一个“最后一个”迭代器。stackoverflow 上的许多帖子表明,要在两个范围之间执行等价,除了调用 std::equal 之外,还必须首先检查范围是否具有相同的大小。如果随机访问迭代器可用,这不会增加任何材料开销。然而,似乎没有随机访问迭代器,仅使用现有 STL 算法实现的第一个代码片段将比代表自定义“等效”算法(不是 STL 的一部分)的第二个代码片段慢。我的问题是,片段 2 是否比仅使用现有 STL 算法编码的任何算法更有效?如果是这样,为什么这个算法不是 STL 的一部分?
片段 1:
template <typename IITR1, typename IITR2>
bool equivalent(IITR1 first1, IITR1 last1, IITR2 first2, IITR2 last2)
{
return distance(first1, last1) == distance(first2, last2) &&
equal( first1, last1, first2 );
}
片段 2:
template <typename IITR1, typename IITR2>
bool equivalent(IITR1 first1, IITR1 last1, IITR2 first2, IITR2 last2)
{
while ( first1 != last1 && first2 != last2 ) {
if (!(*first1 == *first2)) return false;
++first1; ++first2;
}
return first1 == last1 && first2 == last2;
}
注意:我没有检查过,但我非常怀疑编译器是否会优化片段 1,使其生成的代码与片段 2 产生的性能相同。
完整地说,以下代码片段几乎没有用,因为如果范围大小不相等,它将失败:
template <typename IITR1, typename IITR2>
bool equivalent(IITR1 first1, IITR1 last1, IITR2 first2, IITR2 last2)
{
return equal(first1, last1, first2) && equal(first2, last2, first1);
}