您的位置:首页 > 编程语言 > C语言/C++

Boost 学习之算法篇 mismatch

2016-02-01 13:56 369 查看
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>

        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标准库的实现变得可用,那么应该使用这个标准库的实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ Boost