std :: equal重载做了什么?

时间:2014-06-16 20:09:49

标签: stl c++14

我正在查看std::equal最近的c ++ 14重载,我无法弄清楚它们的用途和用途......

两个重载是:

template< class InputIt1, class InputIt2 >
bool equal( InputIt1 first1, InputIt1 last1, 
            InputIt2 first2, InputIt2 last2 );

template< class InputIt1, class InputIt2, class BinaryPredicate >
bool equal( InputIt1 first1, InputIt1 last1, 
            InputIt2 first2, InputIt2 last2,
            BinaryPredicate p );

我完全理解仅使用一个std::equal的传统InputIt2,但第二个InputIt2 last2正在扭曲我的大脑。有人可以解释一下这个例子吗?

1 个答案:

答案 0 :(得分:25)

新的重载实际上非常棒。你传入两个完整的范围,开始和结束,而不是运行较短的一个并调用未定义的行为,算法停止。

此类改进也已添加到std::mismatchstd::is_permutation。您可以在the proposal

中详细了解相关信息

对于std::equal,如果长度不相等,算法将返回false 对于std::mismatch,如果算法到达一个范围的末尾,它将返回迭代器和来自其他范围的相应迭代器。
对于std::is_permutation,如果范围长度不相等,算法也会返回false

为了推理原因,请考虑程序员检查长度不一定是可能的或便宜的。从std::list获得的没有原始列表的范围将需要遍历以获得大小。使用InputIterator的范围,例如用于从标准输入读取,在它到达终点之前可能是无限的,并且只允许遍历一次,因此算法在您执行后不再使用它那。感谢下面的Benjamin Lindley最后一个例子。