1つ目の方法は、sortして、uniqueして、eraseする方法。uniqueは、vectorの要素のうち、となり合う同じ要素をまとめて一つにする関数。しかしuniqueを使うだけでは末尾にゴミが残るので、そのゴミをeraseで削除する。覚えるのは少し大変。
#include <vector> #include <algorithm> #include <iostream> using namespace std; void printVector( vector<int> &vec ){ cout << "size = " << vec.size() << endl; for(int i = 0; i < (int)vec.size(); ++i){ cout << vec[i] << ", "; } cout << endl << endl; } int main(void){ // 8つの要素を持つvector<int>型の変数vecを作成 int _vec[] = {5, 3, 5, 2, 7, 5, 5, 3}; vector<int> vec(&_vec[0], &_vec[ sizeof(_vec) / sizeof(_vec[0]) ]); // unique()を使う準備としてソートが必要 sort(vec.begin(), vec.end()); // unique()をしただけでは後ろにゴミが残るので、eraseで削除する vec.erase( unique(vec.begin(), vec.end()), vec.end() ); printVector(vec); // 2, 3, 5, 7, return 0; }
2つ目の方法は、setのコンストラクタを使う方法。vectorからsetに変換すると、重複要素がなくなり、ついでにソートもされる。
set<int> s(vec.begin(), vec.end());
最終的に欲しいのがvectorの場合は、再度setからvectorに変換すればよい。
vector<int> vec2(s.begin(), s.end());
stl - Most efficient way to erase duplicates and sort a c++ vector? - Stack Overflowによると、重複数が少ない時は2つ目の方法が高速で、重複数が多い時は1つ目の方法が高速らしい。