ぱーぽーの競プロ記

競技プログラミングに関することを書きます。

同一要素の削除 〜uniqueとerase〜

配列内に含まれる同一要素を削除する方法についてのメモ。

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>

using namespace std;

int main() {
  srand(5);
  vector<int> vi;
  
  for(int i = 0; i < 10; i++) {
    vi.push_back(rand() % 5);
  }

  for(int i = 0; i < vi.size(); i++) {
    cout << vi[i] << ' ';
  }
  cout << endl;

// ここから ---------------------------------
  sort(vi.begin(), vi.end());
  vi.erase(unique(vi.begin(), vi.end()), vi.end());
// ここまで ---------------------------------
  
  for(int i = 0; i < vi.size(); i++) {
    cout << vi[i] << ' ';
  }
  cout << endl;

  return 0;
}

出力は以下のようになる。

0 0 4 1 1 3 0 4 4 2 
0 1 2 3 4 

uniqueだけでは余った要素が後ろにたまってしまうのでeraseで削除する必要がある。
また、uniqueを使う前にソートしておかなければならない。