std::search
| ヘッダ <algorithm>
|
||
template< class ForwardIt1, class ForwardIt2 >
ForwardIt1 search( ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last );
|
で定義 (1) | (constexpr C++20以降) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt1 search( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last );
|
(2) | (C++17以降) |
template< class ForwardIt1, class ForwardIt2, class BinaryPred >
ForwardIt1 search( ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last,
BinaryPred p );
|
(3) | (constexpr C++20以降) |
template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2, class BinaryPred >
ForwardIt1 search( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last,
BinaryPred p );
|
(4) | (C++17以降) |
template< class ForwardIt, class Searcher >
ForwardIt search( ForwardIt first, ForwardIt last,
const Searcher& searcher );
|
(5) | (C++17以降) (constexpr C++20以降) |
[s_first, s_last) 内で要素シーケンス [first, last) の最初の出現を検索します。operator== を使用します。p を使用します。policy に従って実行されます。true である場合にのみオーバーロード解決に参加します:
|
|
(C++20まで) |
|
|
(C++20以降) |
[first, last) を、searcher のコンストラクタで指定されたパターンについて検索します。|
標準ライブラリは以下の検索子を提供します:
|
(C++17以降) |
パラメータ
| first, last | - | 検査する要素の範囲を定義するイテレータのペア |
| s_first, s_last | - | 検索する要素の範囲を定義するイテレータのペア |
| policy | - | 使用する実行ポリシー |
| searcher | - | 検索アルゴリズムと検索パターンをカプセル化するサーチャー |
| p | - |
要素が等しいと扱われるべき場合に
true
を返す二項述語。
述語関数のシグネチャは以下と同等であるべきです: bool pred ( const Type1 & a, const Type2 & b ) ;
シグネチャが
const
&
を持つ必要はありませんが、関数は渡されたオブジェクトを変更してはならず、
値カテゴリ
に関係なく(したがって、
Type1
&
は許可されません
、また
Type1
も、
|
| 型要件 | ||
-
ForwardIt1, ForwardIt2
は
LegacyForwardIterator
の要件を満たさなければなりません。
|
||
-
BinaryPred
は
BinaryPredicate
の要件を満たさなければなりません。
|
||
戻り値
[
first
,
last
)
内で最初に現れるシーケンス
[
s_first
,
s_last
)
の先頭を指すイテレータ。そのようなシーケンスが見つからない場合は、
last
が返される。
[
s_first
,
s_last
)
が空の場合、
first
が返されます。
計算量
例外
ExecutionPolicyという名前のテンプレートパラメータを持つオーバーロードは、以下のようにエラーを報告します:
-
アルゴリズムの一部として呼び出された関数の実行が例外をスローした場合、
ExecutionPolicyが 標準ポリシー のいずれかであるとき、 std::terminate が呼び出されます。それ以外のExecutionPolicyについては、動作は実装定義です。 - アルゴリズムがメモリの確保に失敗した場合、 std::bad_alloc がスローされます。
実装例
| 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; } } |
例
#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
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 1205 | C++98 |
[s_first,s_last)が空の場合の戻り値が不明確
|
この場合firstを返す |
| LWG 1338 | C++98 |
LWG issue 1205の解決策が誤って適用され、 一致が見つからない場合にfirstを返すようになっていた |
この場合lastを返す |
| LWG 2150 | C++98 | 「シーケンスの出現」の条件が不正確 | 修正済み |
関連項目
| 特定の範囲内で要素の最後の並びを見つける (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
| あるシーケンスが別のシーケンスの部分列であるかどうかを判定する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
| 二つの要素集合が同じかどうかを判定する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
(C++11) |
特定の条件を満たす最初の要素を見つける (関数テンプレート & アルゴリズム関数オブジェクト) |
(C++20)(C++20)(C++20) |
|
| 2つの範囲を辞書順で比較する (関数テンプレート & アルゴリズム関数オブジェクト) | |
| 2つの範囲が異なる最初の位置を見つける (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
| 範囲内で要素が連続して指定個数コピーされた最初の出現を検索する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
(C++17) |
標準C++ライブラリの検索アルゴリズム実装 (クラステンプレート) |
(C++17) |
Boyer-Moore検索アルゴリズム実装 (クラステンプレート) |
| Boyer-Moore-Horspool検索アルゴリズム実装 (クラステンプレート) | |
(C++20) |
要素範囲の最初の出現を検索する (アルゴリズム関数オブジェクト) |