STLのvectorから同一要素を削除


このエントリーをはてなブックマークに追加

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つ目の方法が高速らしい。