std::find_end
| ヘッダ <algorithm>
|
||
template< class ForwardIt1, class ForwardIt2 >
ForwardIt1 find_end( ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2, ForwardIt2 last2 );
|
で定義 (1) | (C++20 から constexpr) |
template< class ForwardIt1, class ForwardIt2, class BinaryPred >
ForwardIt1 find_end( ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2, ForwardIt2 last2,
BinaryPred p );
|
(2) | (C++20 から constexpr) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt1 find_end( ExecutionPolicy&& policy,
ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2, ForwardIt2 last2 );
|
(3) | (C++17 から) |
template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2, class BinaryPred >
ForwardIt1 find_end( ExecutionPolicy&& policy,
ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2, ForwardIt2 last2,
BinaryPred p );
|
(4) | (C++17 から) |
対象範囲 [first2, last2) の最後の出現をソース範囲 [first1, last1) 内で検索します。
operator== を使用します。p を使用します。policy に従って実行されます。true である場合にのみオーバーロード解決に参加します:
|
|
(C++20 まで) |
|
|
(C++20 から) |
引数
| first1, last1 | - | ソース 範囲 |
| を定義するイテレータのペアfirst2, last2 | - | ターゲット 範囲 |
| を定義するイテレータのペアp | - | 要素を等しいと扱う場合に true を返す二項述語。 述語関数のシグネチャは以下と同等である必要があります:
シグネチャに |
| policy | - | 使用する 実行ポリシー |
| 型要件 | ||
-ForwardIt1 は LegacyForwardIterator の要件を満たす必要があります。
| ||
-ForwardIt2 は LegacyForwardIterator の要件を満たす必要があります。
| ||
戻り値
ソース範囲内のターゲット範囲の最後の出現の先頭を指すイテレータ。
ターゲット範囲が空であるか、ソース範囲内に出現しない場合、last1 が返されます。
計算量
N1 を std::distance(first1, last1) とし、N2 を std::distance(first2, last2) とすると:
operator== による比較。p の適用。operator== による比較。p の適用。例外
- 並列化に必要な一時メモリリソースが利用できない場合、std::bad_alloc がスローされます。
- アルゴリズムの引数を介してオブジェクトにアクセスしているときにキャッチされない例外がスローされた場合、動作は実行ポリシーによって決まります (標準ポリシー の場合、std::terminate が呼び出されます)。
実装例
| find_end (1) |
|---|
template<class ForwardIt1, class ForwardIt2>
constexpr //< since C++20
ForwardIt1 find_end(ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2, ForwardIt2 last2)
{
if (first2 == last2)
return last1;
ForwardIt1 result = last1;
while (true)
{
ForwardIt1 new_result = std::search(first1, last1, first2, last2);
if (new_result == last1)
break;
else
{
result = new_result;
first1 = result;
++first1;
}
}
return result;
}
|
| find_end (2) |
template<class ForwardIt1, class ForwardIt2, class BinaryPred>
constexpr //< since C++20
ForwardIt1 find_end(ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2, ForwardIt2 last2, BinaryPred p)
{
if (first2== last2)
return last1;
ForwardIt1 result = last1;
while (true)
{
ForwardIt1 new_result = std::search(first1, last1, first2, first2, p);
if (new_result == last1)
break;
else
{
result = new_result;
first1 = result;
++first1;
}
}
return result;
}
|
例
#include <algorithm>
#include <array>
#include <cmath>
#include <iostream>
auto print_result = [](auto result, const auto& v)
{
result == v.end()
? std::cout << "Sequence not found\n"
: std::cout << "Last occurrence is at: " << std::distance(v.begin(), result)
<< '\n';
};
int main()
{
const auto v = {1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4};
for (const auto& x : {std::array{1, 2, 3}, {4, 5, 6}})
{
auto iter = std::find_end(v.begin(), v.end(), x.begin(), x.end()); // overload (1)
print_result(iter, v);
}
for (const auto& x : {std::array{-1, -2, -3}, {-4, -5, -6}})
{
auto iter = std::find_end(v.begin(), v.end(), x.begin(), x.end(), // overload (3)
[](int x, int y)
{
return std::abs(x) == std::abs(y);
});
print_result(iter, v);
}
}
出力:
Last occurrence is at: 8
Sequence not found
Last occurrence is at: 8
Sequence not found
欠陥報告
以下の動作を変更する欠陥報告は、以前に公開された C++ 標準に遡って適用されました。
| DR | 適用先 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 1205 | C++98 | ターゲット範囲が空の場合の戻り値が不明確でした | この場合は last1 を返す
|
| LWG 2150 | C++98 | 「出現」の条件が正しくありませんでした | 修正されました |
関連項目
(C++20) |
指定された範囲内の要素の最後のシーケンスを見つける (アルゴリズム関数オブジェクト) |
| 要素の範囲の最初の出現を検索する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
| あるシーケンスが別のシーケンスの部分列であるかどうかを判定する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
| 等しい (または指定された述語を満たす) 最初の隣接する 2 つの項目を見つける (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
(C++11) |
特定の基準を満たす最初の要素を見つける (関数テンプレート & アルゴリズム関数オブジェクト) |
(C++20)(C++20)(C++20) |
|
| 要素の集合のいずれか 1 つを検索する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
| 範囲内の要素の連続したコピーの最初の出現を検索する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |