std::unique
ヘッダ <algorithm> で定義 | ||
(1) | ||
template<class ForwardIt > ForwardIt unique( ForwardIt first, ForwardIt last ); | (C++20未満) | |
template<class ForwardIt > constexpr ForwardIt unique( ForwardIt first, ForwardIt last ); | (C++20以上) | |
template<class ExecutionPolicy, class ForwardIt > ForwardIt unique( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last ); | (2) | (C++17以上) |
(3) | ||
template<class ForwardIt, class BinaryPredicate > ForwardIt unique( ForwardIt first, ForwardIt last, BinaryPredicate p ); | (C++20未満) | |
template<class ForwardIt, class BinaryPredicate > constexpr ForwardIt unique( ForwardIt first, ForwardIt last, BinaryPredicate p ); | (C++20以上) | |
template<class ExecutionPolicy, class ForwardIt, class BinaryPredicate > ForwardIt unique( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, BinaryPredicate p ); | (4) | (C++17以上) |
範囲 [first, last)
から、同等な要素が連続するグループのそれぞれから最初の要素を除くすべての要素を取り除き、その範囲の新しい論理的な終端を指すイテレータを返します。
削除は、消去される要素が上書きされるように、範囲内の要素をずらすことによって行われます。 残る要素の相対順序は維持され、コンテナの物理的なサイズは変更されません。 新しい範囲の論理的な終端と物理的な終端の間の要素を指すイテレータは逆参照可能なままですが、要素それ自体は未規定の値を持ちます。 unique
の呼び出しには、一般的には、それらの未規定の値を消去し、新しい論理的なサイズに一致させるためにコンテナの物理的なサイズを減らす、コンテナの erase
メンバ関数の呼び出しが続きます。
policy
に従って実行されます。 これらのオーバーロードは、 std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> が true でなければ、オーバーロード解決に参加しません。目次 |
[編集]引数
first, last | - | 処理する要素の範囲 |
policy | - | 使用する実行ポリシー。 詳細は実行ポリシーを参照してください |
p | - | 要素が等しいと扱われるべき場合に true を返す二項述語。 述語関数のシグネチャは以下と同等なものであるべきです。 bool pred(const Type1 &a, const Type2 &b); シグネチャが const& を持つ必要はありませんが、関数は渡されたオブジェクトを変更してはなならず、値カテゴリに関わらず |
型の要件 | ||
-ForwardIt は LegacyForwardIterator の要件を満たさなければなりません。 | ||
-ForwardIt を逆参照した型は MoveAssignable の要件を満たさなければなりません。 |
[編集]戻り値
範囲の新しい終端を指すフォワードイテレータ。
[編集]計算量
範囲が空でない場合は、ちょうど std::distance(first,last)-1 回の対応する述語の適用。
[編集]例外
テンプレート引数 ExecutionPolicy
を持つオーバーロードは以下のようにエラーを報告します。
- アルゴリズムの一部として呼び出された関数の実行が例外を投げ、
ExecutionPolicy
が標準のポリシーのいずれかの場合は、 std::terminate が呼ばれます。 それ以外のあらゆるExecutionPolicy
については、動作は処理系定義です。 - アルゴリズムがメモリの確保に失敗した場合は、 std::bad_alloc が投げられます。
[編集]実装例
libstdc++ と libc++ の実装も参照してください。
1つめのバージョン |
---|
template<class ForwardIt> ForwardIt unique(ForwardIt first, ForwardIt last){if(first == last)return last; ForwardIt result = first;while(++first != last){if(!(*result ==*first)&&++result != first){*result = std::move(*first);}}return++result;} |
2つめのバージョン |
template<class ForwardIt, class BinaryPredicate> ForwardIt unique(ForwardIt first, ForwardIt last, BinaryPredicate p){if(first == last)return last; ForwardIt result = first;while(++first != last){if(!p(*result, *first)&&++result != first){*result = std::move(*first);}}return++result;} |
[編集]例
#include <iostream>#include <algorithm>#include <vector>#include <string>#include <cctype> int main(){// remove duplicate elementsstd::vector<int> v{1,2,3,1,2,3,3,4,5,4,5,6,7};std::sort(v.begin(), v.end());// 1 1 2 2 3 3 3 4 4 5 5 6 7 auto last = std::unique(v.begin(), v.end());// v now holds {1 2 3 4 5 6 7 x x x x x x}, where 'x' is indeterminate v.erase(last, v.end());for(int i : v)std::cout<< i <<" ";std::cout<<"\n";}
出力:
1 2 3 4 5 6 7
[編集]関連項目
同じ要素 (または指定された述語を満たす要素) 2つが隣接している最初の位置を探します (関数テンプレート) | |
指定範囲の要素の連続している重複要素が含まれないコピーを作成します (関数テンプレート) | |
一定の基準を満たす要素を削除します (関数テンプレート) | |
連続した重複要素を削除します ( std::list<T,Allocator> のパブリックメンバ関数) |