mismatch
头文件'mismatch.hpp'包含了stl算法mismatch的两个变体。该算法在两个序列中查找第一个破坏两序列一致性的元素位置。
在(被提倡使用的)C++14 前,该算法std::mismatch带了三个迭代器一个用来做比较的可选谓词。前连个迭代器[first1,last1)定义了一个序列范围,第二个迭代器first2定义了第二个序列的起始位置。算法假设第二个迭代器的长度与第一个迭代器的一样长。
在C++14,该算法的两个变体函数被推荐使用,他们带四个迭代器以及一个可选的用作比较的谓词 。这四个迭代器[first1, last1)、[first2, last2)精确的定义了两个序列(之前的算法定义第二个序列是隐式的)。这将使得在更多的情况下能获得正确的结果。
原文链接:http://www.boost.org/doc/libs/1_60_0/libs/algorithm/doc/html/the_boost_algorithm_library/CXX14/mismatch.html
考虑如下两个序列
auto seq1 = { 0, 1, 2 }; auto seq2 = { 0, 1, 2, 3, 4 }; std::mismatch ( seq1.begin (), seq1.end (), seq2.begin ()); // <3, 3> std::mismatch ( seq2.begin (), seq2.end (), seq1.begin ()); // Undefined behavior std::mismatch ( seq1.begin (), seq1.end (), seq2.begin (), seq2.end ()); // <3, 3>
官方API
mismatch函数返回一对迭代器(pair),这对迭代器标注在两个序列中第一次元素不匹配的位置(即,每个序列各取一个位置,因此放回pair)。假如两个序列完全匹配,程序返回元素结束后的迭代器位置(end()位置)。其中一个版本使用std::equal_to做比较,另一个版本使用传递过来的谓词做比较。
template <class InputIterator1, class InputIterator2> std::pair<InputIterator1, InputIterator2> mismatch ( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2 ); template <class InputIterator1, class InputIterator2, class BinaryPredicate> std::pair<InputIterator1, InputIterator2> mismatch ( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, BinaryPredicate pred );例子
//返回<c1.begin(), c2.begin()> 他们的第一个元素就不匹配 mismatch ( c1.begin(), c1.end(), c2.begin(), c2.end()) //<c1.begin() + 4, c2.end ()> //这里所有c2总的元素,满足传递过去的c1中的自序列范围,因此返回的都是越过结尾的位置 mismatch ( c1.begin() + 1, c1.begin() + 4, c2.begin(), c2.end()) //注意,c1.begin()+4这个迭代器标注的是第一个序列的越过结尾位置,并没有用来做比较,两个元素比较的是一个左闭右开的区间范围 //返回<c1.end(), c2.end()> mismatch ( c1.end(),c1.end(),c2.end(), c2.end())