std::find_first_of
| ヘッダ <algorithm>
|
||
template< class InputIt, class ForwardIt >
InputIt find_first_of( InputIt first1, InputIt last1,
ForwardIt first2, ForwardIt last2 );
|
で定義 (1) | (constexpr C++20以降) |
template< class InputIt, class ForwardIt, class BinaryPred >
InputIt find_first_of( InputIt first1, InputIt last1,
ForwardIt first2, ForwardIt last2,
BinaryPred p );
|
(2) | (constexpr C++20以降) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt1 find_first_of( ExecutionPolicy&& policy,
ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2, ForwardIt2 last2 );
|
(3) | (C++17以降) |
template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2, class BinaryPred >
ForwardIt1 find_first_of( ExecutionPolicy&& policy,
ForwardIt1 first1, ForwardIt last1,
ForwardIt2 first2, ForwardIt2 last2,
BinaryPred p );
|
(4) | (C++17以降) |
ソース範囲 [first1, last1) 内から、ターゲット範囲 [first2, last2) 内のいずれかの要素を検索します。
operator== を使用します。p を使用します。policy に従って実行されます。true である場合にのみオーバーロード解決に参加します。
|
|
(C++20まで) |
|
|
(C++20以降) |
引数
| first1, last1 | - | ソース範囲を定義するイテレータのペア範囲 |
| first2, last2 | - | ターゲット範囲を定義するイテレータのペア範囲 |
| p | - | 要素が等しいと扱われるべき場合に true を返す二項述語。述語関数のシグネチャは以下と等価であるべきです:
シグネチャに |
| policy | - | 使用する実行ポリシー |
| 型要件 | ||
-InputIt は LegacyInputIterator の要件を満たさなければなりません。
| ||
-ForwardIt は LegacyForwardIterator の要件を満たさなければなりません。
| ||
-ForwardIt1 は LegacyForwardIterator の要件を満たさなければなりません。
| ||
-ForwardIt2 は LegacyForwardIterator の要件を満たさなければなりません。
| ||
-BinaryPred は BinaryPredicate の要件を満たさなければなりません。
| ||
戻り値
ソース範囲内で、ターゲット範囲のいずれかの要素と一致する最初の要素を指すイテレータ。
ターゲット範囲が空であるか、そのような要素が見つからない場合、last1 が返されます。
計算量
\N1 を std::distance(first1, last1)、N2 を std::distance(first2, last2) とすると:
operator== による比較。p の適用。operator== による比較。p の適用。例外
- 並列化に必要な一時メモリリソースが利用できない場合、std::bad_alloc がスローされます。
- アルゴリズムの引数を介してオブジェクトにアクセスしている間にキャッチされない例外がスローされた場合、動作は実行ポリシーによって決まります(標準ポリシーの場合、std::terminate が呼び出されます)。
実装例
| find_first_of (1) |
|---|
template<class InputIt, class ForwardIt>
InputIt find_first_of(InputIt first1, InputIt last1,
ForwardIt first2, ForwardIt last2)
{
for (; first1 != last1; ++first1)
for (ForwardIt it = first2; it != last2; ++it)
if (*first1 == *it)
return first1;
return last1;
}
|
| find_first_of (2) |
template<class InputIt, class ForwardIt, class BinaryPred>
InputIt find_first_of(InputIt first1, InputIt last1,
ForwardIt first2, ForwardIt last2,
BinaryPred p)
{
for (; first1 != last1; ++first1)
for (ForwardIt it = first2; it != last2; ++it)
if (p(*first1, *it))
return first1;
return last1;
}
|
例
以下のコードは、整数のベクタ内で指定された整数のいずれかを検索します。
#include <algorithm>
#include <iostream>
#include <vector>
auto print_sequence = [](const auto id, const auto& seq, int pos = -1)
{
std::cout << id << "{ ";
for (int i{}; const auto& e : seq)
{
const bool mark{i == pos};
std::cout << (i++ ? ", " : "");
std::cout << (mark ? "[ " : "") << e << (mark ? " ]" : "");
}
std::cout << " }\n";
};
int main()
{
const std::vector<int> v{0, 2, 3, 25, 5};
const auto t1 = {19, 10, 3, 4};
const auto t2 = {1, 6, 7, 9};
auto find_any_of = [](const auto& v, const auto& t)
{
const auto result = std::find_first_of(v.begin(), v.end(),
t.begin(), t.end());
if (result == v.end())
{
std::cout << "No elements of v are equal to any element of ";
print_sequence("t = ", t);
print_sequence("v = ", v);
}
else
{
const auto pos = std::distance(v.begin(), result);
std::cout << "Found a match (" << *result << ") at position " << pos;
print_sequence(", where t = ", t);
print_sequence("v = ", v, pos);
}
};
find_any_of(v, t1);
find_any_of(v, t2);
}
出力:
Found a match (3) at position 2, where t = { 19, 10, 3, 4 }
v = { 0, 2, [ 3 ], 25, 5 }
No elements of v are equal to any element of t = { 1, 6, 7, 9 }
v = { 0, 2, 3, 25, 5 }
欠陥報告
以下の動作を変更する欠陥報告は、以前に公開されたC++標準に遡及的に適用されました。
| DR | 適用先 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 576 | C++98 | first1 と last1 は LegacyForwardIteratorである必要があった
|
それらは LegacyInputIteratorであるだけでよい |
| LWG 1205 | C++98 | ターゲット範囲が空の場合、戻り値が不明瞭だった | この場合は last1 を返す
|
関連項目
(C++20) |
要素の集合の中からいずれかを検索する (アルゴリズム関数オブジェクト) |
(C++11) |
特定の基準を満たす最初の要素を見つける (関数テンプレート & アルゴリズム関数オブジェクト) |
(C++20)(C++20)(C++20) |