我正在查看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
正在扭曲我的大脑。有人可以解释一下这个例子吗?
答案 0 :(得分:25)
新的重载实际上非常棒。你传入两个完整的范围,开始和结束,而不是运行较短的一个并调用未定义的行为,算法停止。
此类改进也已添加到std::mismatch
和std::is_permutation
。您可以在the proposal
对于std::equal
,如果长度不相等,算法将返回false
对于std::mismatch
,如果算法到达一个范围的末尾,它将返回迭代器和来自其他范围的相应迭代器。
对于std::is_permutation
,如果范围长度不相等,算法也会返回false
。
为了推理原因,请考虑程序员检查长度不一定是可能的或便宜的。从std::list
获得的没有原始列表的范围将需要遍历以获得大小。使用InputIterator
的范围,例如用于从标准输入读取,在它到达终点之前可能是无限的,并且只允许遍历一次,因此算法在您执行后不再使用它那。感谢下面的Benjamin Lindley最后一个例子。