std::mismatch
| ヘッダー <algorithm> で定義 |
||
template< class InputIt1, class InputIt2 > std::pair<InputIt1, InputIt2> |
(1) | (C++20 以降 constexpr) |
| template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > std::pair<ForwardIt1, ForwardIt2> |
(2) | (C++17以降) |
template< class InputIt1, class InputIt2, class BinaryPred > std::pair<InputIt1, InputIt2> |
(3) | (C++20 以降 constexpr) |
| template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryPred > |
(4) | (C++17以降) |
template< class InputIt1, class InputIt2 > std::pair<InputIt1, InputIt2> |
(5) | (C++14以降) (C++20 以降 constexpr) |
| template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > std::pair<ForwardIt1, ForwardIt2> |
(6) | (C++17以降) |
template< class InputIt1, class InputIt2, class BinaryPred > std::pair<InputIt1, InputIt2> |
(7) | (C++14以降) (C++20 以降 constexpr) |
| template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryPred > |
(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 に到達したときに停止します。
|
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 | - | 比較する2番目の要素の範囲を定義するイテレータのペア |
| policy | - | 使用する 実行ポリシー |
| p | - | 要素が等しいと見なされる場合に true を返す二項述語。 述語関数のシグネチャは、以下と同等である必要がある。 bool pred(const Type1 &a, const Type2 &b); シグネチャは const & を持つ必要はないが、関数は渡されたオブジェクトを変更してはならず、値カテゴリに関わらず、(おそらく const の) |
| 型要件 | ||
-InputIt1 は LegacyInputIterator の要件を満たしている必要があります。 | ||
-InputIt2 は LegacyInputIterator の要件を満たしている必要があります。 | ||
-ForwardIt1 は LegacyForwardIterator の要件を満たしている必要があります。 | ||
-ForwardIt2 は LegacyForwardIterator の要件を満たしている必要があります。 | ||
-BinaryPred は BinaryPredicate の要件を満たす必要がある。 | ||
[編集] 戻り値
最初の2つの等しくない要素へのイテレータを含む std::pair。
last1 に到達した場合、ペアの2番目のイテレータは first2 から数えて std::distance(first1, last1)番目 のイテレータです。
オーバーロード (5-8) の場合、last2 に到達した場合、ペアの最初のイテレータは first1 から数えて std::distance(first2, last2)番目 のイテレータです。
[編集] 計算量
std::distance(first1, last1) を N1 とし、std::distance(first2, last2) を N2 とする。
[編集] 例外
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++11) |
特定の基準を満たす最初の要素を見つける (関数テンプレート) |
| ある範囲が別の範囲より辞書順で小さい場合に true を返す (関数テンプレート) | |
| 要素の範囲の最初の出現を検索する (関数テンプレート) | |
| (C++20) |
2つの範囲が異なる最初の位置を見つける (アルゴリズム関数オブジェクト) |