std::search
| ヘッダー <algorithm> で定義 |
||
template< class ForwardIt1, class ForwardIt2 > ForwardIt1 search( ForwardIt1 first, ForwardIt1 last, |
(1) | (C++20 以降 constexpr) |
| template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > ForwardIt1 search( ExecutionPolicy&& policy, |
(2) | (C++17以降) |
template< class ForwardIt1, class ForwardIt2, class BinaryPred > ForwardIt1 search( ForwardIt1 first, ForwardIt1 last, |
(3) | (C++20 以降 constexpr) |
| template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryPred > |
(4) | (C++17以降) |
| template< class ForwardIt, class Searcher > ForwardIt search( ForwardIt first, ForwardIt last, |
(5) | (C++17以降) (C++20 以降 constexpr) |
[first, last) 内で、範囲 [s_first, s_last) の要素シーケンスの最初の出現箇所を検索します。|
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以降) |
[first, last) 内で、searcher のコンストラクタで指定されたパターンを検索します。|
標準ライブラリは以下の searcher を提供します。
|
(C++17以降) |
目次 |
[edit] パラメータ
| first, last | - | 検査する要素の範囲を定義するイテレータのペア |
| s_first, s_last | - | 検索対象の要素の範囲を定義するイテレータのペア。 |
| policy | - | 使用する 実行ポリシー |
| searcher | - | 検索アルゴリズムと検索対象のパターンをカプセル化する searcher。 |
| p | - | 要素が等しいと見なされる場合に true を返す二項述語。 述語関数のシグネチャは、以下と同等である必要がある。 bool pred(const Type1 &a, const Type2 &b); シグネチャは const & を持つ必要はないが、関数は渡されたオブジェクトを変更してはならず、値カテゴリに関わらず、(おそらく const の) |
| 型要件 | ||
-ForwardIt1, ForwardIt2 は LegacyForwardIterator の要件を満たさなければなりません。 | ||
-BinaryPred は BinaryPredicate の要件を満たす必要がある。 | ||
[edit] 戻り値
[first, last) 内で、シーケンス [s_first, s_last) の最初の出現箇所の先頭を指すイテレータ。そのような出現箇所が見つからなかった場合は、last が返されます。[s_first, s_last) が空の場合、first が返されます。[edit] 計算量
[edit] 例外
ExecutionPolicy というテンプレートパラメータを持つオーバーロードは、次のようにエラーを報告します。
- アルゴリズムの一部として呼び出された関数の実行が例外をスローし、
ExecutionPolicyが 標準ポリシー のいずれかである場合、std::terminate が呼び出されます。その他のExecutionPolicyの場合、動作は実装定義です。 - アルゴリズムがメモリの割り当てに失敗した場合、std::bad_alloc がスローされます。
[edit] 実装例
| search (1) |
|---|
template<class ForwardIt1, class ForwardIt2> constexpr //< since C++20 ForwardIt1 search(ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last) { while (true) { ForwardIt1 it = first; for (ForwardIt2 s_it = s_first; ; ++it, ++s_it) { if (s_it == s_last) return first; if (it == last) return last; if (!(*it == *s_it)) break; } ++first; } } |
| search (3) |
template<class ForwardIt1, class ForwardIt2, class BinaryPred> constexpr //< since C++20 ForwardIt1 search(ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last, BinaryPred p) { while (true) { ForwardIt1 it = first; for (ForwardIt2 s_it = s_first; ; ++it, ++s_it) { if (s_it == s_last) return first; if (it == last) return last; if (!p(*it, *s_it)) break; } ++first; } } |
[edit] 例
#include <algorithm> #include <cassert> #include <functional> #include <iomanip> #include <iostream> #include <iterator> #include <string_view> #include <vector> using namespace std::literals; bool contains(const auto& cont, std::string_view s) { // str.find() (or str.contains(), since C++23) can be used as well return std::search(cont.begin(), cont.end(), s.begin(), s.end()) != cont.end(); } int main() { const auto str{"why waste time learning, when ignorance is instantaneous?"sv}; assert(contains(str, "learning")); assert(not contains(str, "lemming")); const std::vector vec(str.begin(), str.end()); assert(contains(vec, "learning")); assert(not contains(vec, "leaning")); // The C++17 overload with searchers demo: constexpr auto quote { "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed " "do eiusmod tempor incididunt ut labore et dolore magna aliqua"sv }; for (const auto word : {"pisci"sv, "Pisci"sv}) { std::cout << "The string " << std::quoted(word) << ' '; const std::boyer_moore_searcher searcher(word.begin(), word.end()); const auto it = std::search(quote.begin(), quote.end(), searcher); if (it == quote.end()) std::cout << "not found\n"; else std::cout << "found at offset " << std::distance(quote.begin(), it) << '\n'; } }
出力
The string "pisci" found at offset 43 The string "Pisci" not found
[edit] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 1205 | C++98 | [s_first, s_last) が空の場合の戻り値が不明瞭でした。 |
この場合、first が返されます。 |
| LWG 1338 | C++98 | LWG issue 1205 の解決策が誤って適用され、 出現箇所が見つからなかった場合に first が返されるようになっていました。 |
この場合、last が返されます。 |
| LWG 2150 | C++98 | 「シーケンス出現」の条件が正しくなかった | 修正済み |
[edit] 関連項目
| 特定の範囲内で最後の要素のシーケンスを見つける (関数テンプレート) | |
| あるシーケンスが別のシーケンスの部分シーケンスである場合に true を返す (関数テンプレート) | |
| 2つの要素の集合が同じかどうかを判断する (関数テンプレート) | |
| (C++11) |
特定の基準を満たす最初の要素を見つける (関数テンプレート) |
| ある範囲が別の範囲より辞書順で小さい場合に true を返す (関数テンプレート) | |
| 2つの範囲が異なる最初の位置を見つける (関数テンプレート) | |
| 範囲内である要素が連続して出現する最初の箇所を検索する (関数テンプレート) | |
| (C++17) |
標準C++ライブラリの探索アルゴリズム実装 (クラステンプレート) |
| (C++17) |
ボイヤー・ムーア法探索アルゴリズム実装 (クラステンプレート) |
| ボイヤー・ムーア・ホースプール法探索アルゴリズム実装 (クラステンプレート) | |
| (C++20) |
要素の範囲の最初の出現を検索する (アルゴリズム関数オブジェクト) |