std :: equal重载做了什么?

Syn*_*ose 12 stl c++14

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

两个重载是:

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 );
Run Code Online (Sandbox Code Playgroud)

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

gho*_*ast 25

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

这些改进也被添加到std::mismatchstd::is_permutation.您可以在提案中详细了解此信息

因为std::equal,false如果长度不相等,算法将简单地返回.
因为std::mismatch,如果算法到达一个范围的末尾,它将返回迭代器和来自另一个范围的相应迭代器.
因为std::is_permutation,false如果范围的长度不相等,算法也会简单地返回.

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

  • @SyntacticFructose:有时您不知道范围的长度。例如,使用`istream_iterator`。 (8认同)
  • @SyntacticFructose,该提案的主要观点是在不强制程序员检查的情况下防止未定义的行为。这种检查有时不是那么简单。例如,当使用一对 `ForwardIterator` 时,您需要遍历以检查长度。本杰明有一个很好的观点。如果您检查该给定范围的长度,则您已使其无效。也许这些信息在答案本身中会更好。 (4认同)