名稱空間
變體
操作

std::mismatch

來自 cppreference.com
< cpp‎ | 演算法
 
 
演算法庫
有約束演算法與針對範圍的演算法 (C++20)
有約束的演算法,例如 ranges::copyranges::sort 等……
執行策略 (C++17)
排序及相關操作
劃分操作
排序操作
二分搜尋操作
(於已劃分範圍上)
集合操作(於已排序範圍上)
歸併操作(於已排序範圍上)
堆操作
最小/最大值操作
(C++11)
(C++17)
字典序比較操作
排列操作
C 庫
數值操作
未初始化記憶體上的操作
 
定義於標頭檔案 <algorithm>
template< class InputIt1, class InputIt2 >

std::pair<InputIt1, InputIt2>
    mismatch( InputIt1 first1, InputIt1 last1,

              InputIt2 first2 );
(1) (C++20 起為 constexpr)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >

std::pair<ForwardIt1, ForwardIt2>
    mismatch( ExecutionPolicy&& policy,
              ForwardIt1 first1, ForwardIt1 last1,

              ForwardIt2 first2 );
(2) (C++17 起)
template< class InputIt1, class InputIt2, class BinaryPred >

std::pair<InputIt1, InputIt2>
    mismatch( InputIt1 first1, InputIt1 last1,

              InputIt2 first2, BinaryPred p );
(3) (C++20 起為 constexpr)
template< class ExecutionPolicy,

          class ForwardIt1, class ForwardIt2, class BinaryPred >
std::pair<ForwardIt1, ForwardIt2>
    mismatch( ExecutionPolicy&& policy,
              ForwardIt1 first1, ForwardIt1 last1,

              ForwardIt2 first2, BinaryPred p );
(4) (C++17 起)
template< class InputIt1, class InputIt2 >

std::pair<InputIt1, InputIt2>
    mismatch( InputIt1 first1, InputIt1 last1,

              InputIt2 first2, InputIt2 last2 );
(5) (C++14 起)
(C++20 起為 constexpr)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >

std::pair<ForwardIt1, ForwardIt2>
    mismatch( ExecutionPolicy&& policy,
              ForwardIt1 first1, ForwardIt1 last1,

              ForwardIt2 first2, ForwardIt2 last2 );
(6) (C++17 起)
template< class InputIt1, class InputIt2, class BinaryPred >

std::pair<InputIt1, InputIt2>
    mismatch( InputIt1 first1, InputIt1 last1,

              InputIt2 first2, InputIt2 last2, BinaryPred p );
(7) (C++14 起)
(C++20 起為 constexpr)
template< class ExecutionPolicy,

          class ForwardIt1, class ForwardIt2, class BinaryPred >
std::pair<ForwardIt1, ForwardIt2>
    mismatch( ExecutionPolicy&& policy,
              ForwardIt1 first1, ForwardIt1 last1,

              ForwardIt2 first2, ForwardIt2 last2, BinaryPred p );
(8) (C++17 起)

返回一個迭代器對,指向來自 [first1last1) 和一個從 first2 開始的範圍中第一個不匹配的元素。

  • 對於過載 (1-4),第二個範圍有 std::distance(first1, last1) 個元素。
  • 對於過載 (5-8),第二個範圍是 [first2last2)
1,5) 元素使用 operator== 進行比較。
3,7) 元素使用給定的二元謂詞 p 進行比較。
2,4,6,8)(1,3,5,7) 相同,但根據 policy 執行。
僅當滿足所有以下條件時,這些過載才參與過載決議

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>true

(C++20 前)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>true

(C++20 起)

目錄

[編輯] 引數

first1, last1 - 定義要比較的第一個元素範圍的迭代器對
first2, last2 - 定義要比較的第二個元素範圍的迭代器對
policy - 要使用的 執行策略
p - 二元謂詞,如果元素應被視為相等,則返回 true。

謂詞函式的簽名應等效於以下內容:

 bool pred(const Type1 &a, const Type2 &b);

雖然簽名不需要包含 const &,但函式不得修改傳遞給它的物件,並且必須能夠接受 Type1Type2 型別(可能是 const)的所有值,無論 值類別 (因此,不允許使用 Type1 & ,也不允許使用 Type1,除非對於 Type1 移動等同於複製(C++11 起))。
型別 Type1Type2 必須使得型別為 InputIt1InputIt2 的物件可以被解引用,然後隱式轉換為 Type1Type2。​

型別要求
-
InputIt1 必須滿足 LegacyInputIterator 的要求。
-
InputIt2 必須滿足 LegacyInputIterator 的要求。
-
ForwardIt1 必須滿足 LegacyForwardIterator 的要求。
-
ForwardIt2 必須滿足 LegacyForwardIterator 的要求。
-
BinaryPred 必須滿足 BinaryPredicate 的要求。

[編輯] 返回值

std::pair,包含指向前兩個不相等元素的迭代器。

如果到達 last1,則對中的第二個迭代器是 std::distance(first1, last1) 個迭代器,位於 first2 之後。

對於過載 (5-8),如果到達 last2,則對中的第一個迭代器是 std::distance(first2, last2) 個迭代器,位於 first1 之後。

[編輯] 複雜度

給定 N1std::distance(first1, last1)N2std::distance(first2, last2)

1,2) 最多 N1 次使用 operator== 的比較。
3,4) 最多 N1 次謂詞 p 的應用。
5,6) 最多 min(N1,N2) 次使用 operator== 的比較。
7,8) 最多 min(N1,N2) 次謂詞 p 的應用。

[編輯] 異常

帶有模板引數 ExecutionPolicy 的過載按如下方式報告錯誤

  • 如果作為演算法一部分呼叫的函式執行丟擲異常,並且 ExecutionPolicy標準策略 之一,則呼叫 std::terminate。對於任何其他 ExecutionPolicy,行為是實現定義的。
  • 如果演算法未能分配記憶體,則丟擲 std::bad_alloc

[編輯] 可能的實現

mismatch (1)
template<class InputIt1, class InputIt2>
std::pair<InputIt1, InputIt2>
    mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2)
{
    while (first1 != last1 && *first1 == *first2)
        ++first1, ++first2;
 
    return std::make_pair(first1, first2);
}
mismatch (3)
template<class InputIt1, class InputIt2, class BinaryPred>
std::pair<InputIt1, InputIt2>
    mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPred p)
{
    while (first1 != last1 && p(*first1, *first2))
        ++first1, ++first2;
 
    return std::make_pair(first1, first2);
}
mismatch (5)
template<class InputIt1, class InputIt2>
std::pair<InputIt1, InputIt2>
    mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
{
    while (first1 != last1 && first2 != last2 && *first1 == *first2)
        ++first1, ++first2;
 
    return std::make_pair(first1, first2);
}
mismatch (7)
template<class InputIt1, class InputIt2, class BinaryPred>
std::pair<InputIt1, InputIt2>
    mismatch(InputIt1 first1, InputIt1 last1,
             InputIt2 first2, InputIt2 last2, BinaryPred p)
{
    while (first1 != last1 && first2 != last2 && p(*first1, *first2))
        ++first1, ++first2;
 
    return std::make_pair(first1, first2);
}

[編輯] 示例

此程式確定給定字串開頭和結尾處(反向,可能重疊)同時找到的最長子字串。

#include <algorithm>
#include <iostream>
#include <string>
 
std::string mirror_ends(const std::string& in)
{
    return std::string(in.begin(),
                       std::mismatch(in.begin(), in.end(), in.rbegin()).first);
}
 
int main()
{
    std::cout << mirror_ends("abXYZba") << '\n'
              << mirror_ends("abca") << '\n'
              << mirror_ends("aba") << '\n';
}

輸出

ab
a
aba

[編輯] 參見

判斷兩組元素是否相同
(函式模板) [編輯]
尋找第一個滿足特定條件的元素
(函式模板) [編輯]
如果一個範圍在字典上小於另一個範圍,則返回 true
(函式模板) [編輯]
搜尋一個範圍的元素首次出現的位置
(函式模板) [編輯]
尋找兩個範圍開始不同的第一個位置
(演算法函式物件)[編輯]