Boost 学习之算法篇 mismatch

来源:互联网 发布:mac子弹头 dubonnet 编辑:程序博客网 时间:2024/06/04 19:03

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 behaviorstd::mismatch ( seq1.begin (), seq1.end (), seq2.begin (), seq2.end ()); // <3, 3>

        seq2的前面N个元素与seq1的一样。在第二个例子中,算法将会读取超过seq1结尾后的内容,这将导致未定义的行为。然而,假如两个序列的是完全指定的,很容易看出,不匹配的位置将是哪里。(即,连个序列的范围完全在传递参数的时候指定好,也就是使用4个迭代器)

官方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 { 0, 1, 2, 3, 14, 15 },C2{ 1, 2, 3 }

//返回<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()) 

迭代器要求
        mismatch 将作用于除了output迭代器外的所有迭代器。

时间复杂度
        两个变体函数的时间复杂度都是O(N);也就是说,他们仅仅比较序列中的元素一次。假如在序列中发现有任何一个元素不相同,则函数马上返回,不管余下的元素。

异常安全
        两个函数都是传值调用,并且不依靠任何全局状态。因此这些函数提供了很强的异常安全性保证。

注意
    假如连个序列相同(或者都为空),则mismatch函数返回两个序列的超出末端迭代器。
    这四个迭代器版本的mismatch函数是c++14标准的一部分,当c++14标准库的实现变得可用,那么应该使用这个标准库的实现。

0 0
原创粉丝点击