std::unique_copy
| ヘッダ <algorithm>
|
||
template< class InputIt, class OutputIt >
OutputIt unique_copy( InputIt first, InputIt last, OutputIt d_first );
|
で定義 (1) | (constexpr C++20以降) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt2 unique_copy( ExecutionPolicy&& policy, ForwardIt1 first,
ForwardIt1 last, ForwardIt2 d_first );
|
(2) | (C++17以降) |
template< class InputIt, class OutputIt, class BinaryPred >
OutputIt unique_copy( InputIt first, InputIt last,
OutputIt d_first, BinaryPred p );
|
(3) | (constexpr C++20以降) |
template< class ExecutionPolicy, class ForwardIt1,
class ForwardIt2, class BinaryPred >
ForwardIt2 unique_copy( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
ForwardIt2 d_first, BinaryPred p );
|
(4) | (C++17以降) |
範囲 [first, last) の要素を、連続する等しい要素が存在しないように、別の範囲の先頭 d_first にコピーします。等しい要素の各グループの最初の要素のみがコピーされます。
operator== を使用して比較されます。operator== が 同値関係を確立しない場合、動作は未定義です。p を使用して比較されます。p が同値関係を確立しない場合、動作は未定義です。policy に従って実行されます。true である場合にのみオーバーロード解決に参加します:
|
|
(C++20まで) |
|
|
(C++20以降) |
*d_first = *first が無効である場合(C++20まで)*first が 書き込み可能でない場合d_first(C++20以降)、プログラムは ill-formed です。
送信元と送信先の範囲が重なっている場合、動作は未定義です。
T が InputIt の値型である場合、オーバーロード (1) または (3) が以下の条件をすべて満たさ ない 場合、動作は未定義です:
|
(C++20まで) |
|
(C++20以降) |
TCopyConstructible かつ CopyAssignable である。- 以下のすべての条件が満たされる:
OutputItLegacyForwardIterator の要件を満たす。OutputItの値型もTである。TCopyAssignable である。
パラメータ
| first, last | - | 処理する要素のソース 範囲 を定義するイテレータのペア |
| d_first | - | 宛先範囲の先頭 |
| policy | - | 使用する 実行ポリシー |
| p | - |
要素が等しいと見なされるべき場合に
true
を返す二項述語。
述語関数のシグネチャは以下と同等であるべきです: bool pred ( const Type1 & a, const Type2 & b ) ;
シグネチャが
const
&
を持つ必要はありませんが、関数は渡されたオブジェクトを変更してはならず、
値カテゴリ
に関係なく型
|
| 型要件 | ||
-
InputIt
は
LegacyInputIterator
の要件を満たさなければなりません。
|
||
-
OutputIt
は
LegacyOutputIterator
の要件を満たさなければなりません。
|
||
-
ForwardIt1, ForwardIt2
は
LegacyForwardIterator
の要件を満たさなければなりません。
|
||
戻り値
最後に書き込まれた要素の次の要素を指す出力イテレータ。
計算量
与えられた N が std:: distance ( first, last ) である場合:
オーバーロード
(2,4)
の場合、
ForwardIt1
の値型が
CopyConstructible
と
CopyAssignable
の両方を満たさない場合、パフォーマンスコストが発生する可能性があります。
例外
ExecutionPolicyという名前のテンプレートパラメータを持つオーバーロードは、
以下のようにエラーを報告します:
-
アルゴリズムの一部として呼び出された関数の実行が例外をスローした場合、
ExecutionPolicyが 標準ポリシー のいずれかであるとき、 std::terminate が呼び出される。それ以外のExecutionPolicyについては、動作は実装定義である。 - アルゴリズムがメモリの確保に失敗した場合、 std::bad_alloc がスローされる。
実装例
実装例については libstdc++ および libc++ も参照してください。
注記
InputItが
LegacyForwardIterator
を満たす場合、この関数は重複を検出するために入力を再読み込みします。
そうでなければ、
OutputIt
が
LegacyForwardIterator
を満たし、かつ
InputIt
の値型が
OutputIt
の値型と同じである場合、この関数は
*
d_first
と
*
first
を比較します。
それ以外の場合、この関数は * first をローカル要素のコピーと比較します。
例
#include <algorithm> #include <iostream> #include <iterator> #include <string> int main() { std::string s1 {"A string with mmmany letters!"}; std::cout << "Before: " << s1 << '\n'; std::string s2; std::unique_copy(s1.begin(), s1.end(), std::back_inserter(s2), [](char c1, char c2) { return c1 == 'm' && 'm' == c2; }); std::cout << "After: " << s2 << '\n'; }
出力:
Before: A string with mmmany letters! After: A string with many letters!
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 239 | C++98 | 述語が std:: distance ( first, last ) 回適用された |
1回少なく適用される
(空でない範囲の場合) |
| LWG 241 | C++98 |
InputIt
の値型が
CopyConstructible
であることが要求されていなかった
|
条件付きで要求される |
| LWG 538 | C++98 |
InputIt
の値型が
CopyAssignable
であることが要求されていなかった
|
条件付きで要求される |
| LWG 2439 | C++98 |
InputIt
の値型が
CopyConstructible であることが要求されていなかった (
OutputIt
が
LegacyForwardIterator
の場合)
|
条件付きで要求される |
関連項目
| 最初の隣接する等しい(または指定された述語を満たす)2つの要素を検索する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
| 範囲内の連続した重複要素を削除する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
(C++11) |
要素の範囲を新しい場所にコピーする (関数テンプレート & アルゴリズム関数オブジェクト) |
(C++20)(C++20) |
|
(C++20) |
連続した重複を含まない要素の範囲のコピーを作成する (アルゴリズム関数オブジェクト) |