std::mismatch
| ヘッダ で定義 <algorithm>
|
||
template< class InputIt1, class InputIt2 >
std::pair<InputIt1, InputIt2>
mismatch( InputIt1 first1, InputIt1 last1,
InputIt2 first2 );
|
(1) | (constexpr C++20以降) |
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) | (constexpr C++20以降) |
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以降) (constexpr C++20以降) |
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以降) (constexpr C++20以降) |
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以降) |
最初の不一致要素へのイテレータのペアを返します。要素は [first1, last1) および、 から始まる範囲 first2:
- オーバーロード (1-4)、2番目の範囲は
std::distance(first1, last1)個の要素。 - オーバーロード (5-8)、2番目の範囲は
[first2,last2)。
- もし
std::distance(first1, last1)とstd::distance(first2, last2)が異なる場合、比較はlast1またはlast2に達する。
- もし
operator==。p。policy。true:
|
|
(C++20まで) |
|
|
(C++20以降) |
パラメータ
| first1, last1 | - | 比較対象となる最初の要素の範囲を定義するイテレータのペア |
| first2, last2 | - | 比較対象となる2番目の要素の範囲を定義するイテレータのペア |
| policy | - | 使用する実行ポリシー |
| p | - |
要素が等価として扱われるべき場合に
true
を返す二項述語。
述語関数のシグネチャは以下と同等であるべきです: bool pred ( const Type1 & a, const Type2 & b ) ;
シグネチャが
const
&
を持つ必要はありませんが、関数は渡されたオブジェクトを変更してはならず、値カテゴリに関係なく
|
| 型要件 | ||
-
InputIt1
は
LegacyInputIterator
の要件を満たさなければなりません。
|
||
-
InputIt2
は
LegacyInputIterator
の要件を満たさなければなりません。
|
||
-
ForwardIt1
は
LegacyForwardIterator
の要件を満たさなければなりません。
|
||
-
ForwardIt2
は
LegacyForwardIterator
の要件を満たさなければなりません。
|
||
-
BinaryPred
は
BinaryPredicate
の要件を満たさなければなりません。
|
||
戻り値
std::pair 最初の2つの等しくない要素へのイテレータを持つ。
last1 に達した場合、ペアの2番目のイテレータは std:: distance ( first1, last1 ) 番目の first2 以降のイテレータとなる。
オーバーロード (5-8) の場合、 last2 に到達したとき、ペア内の最初のイテレータは std:: distance ( first2, last2 ) 番目の イテレータであり、 first1 の後ろに位置します。
計算量
N 1 を std:: distance ( first1, last1 ) として、 N 2 を std:: distance ( first2, last2 ) として定義する:
例外
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
関連項目
| 2つの要素集合が同じかどうかを判定する (関数テンプレート &アルゴリズム関数オブジェクト) | |
(C++20) |
|
(C++11) |
特定の条件を満たす最初の要素を検索する (関数テンプレート &アルゴリズム関数オブジェクト) |
(C++20)(C++20)(C++20) |
|
| 2つの範囲を辞書順で比較する (関数テンプレート &アルゴリズム関数オブジェクト) | |
| ある要素範囲が最初に現れる位置を検索する (関数テンプレート &アルゴリズム関数オブジェクト) | |
(C++20) |
|
(C++20) |
2つの範囲が異なる最初の位置を見つける (アルゴリズム関数オブジェクト) |