c++ vector の重複削除

はじめに

vector の要素の重複の削除方法を2つ示します

  • unique, erase を用いる方法
  • vector -> set -> vector と変換する方法

unique erase を用いる方法

1 ~ 6 の数字からなり、すべての数字が2回出現する vector {1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1}の重複を削除します。

unique は隣り合った重複要素を除き、末尾のイテレータを返します。

ただし、重複削除が行われるのは、隣り合っている要素が重複しているときのみです。
つまり、 {1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1} を {1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1}として末尾のイテレータを返す。

したがって、完全に重複要素を削除するには、ソートを行い、重複要素を隣同士に配置してから unique 処理を行う必要があります。

unique の動作確認

また、unique は vector の要素から重複を削除はせず、重複しない要素を前に集めるだけなので、erase を行わなければならなりません。

この挙動は名前から受ける印象と異なるので注意しないといつか間違えそう。

vector, set, vector と変換する方法

set は重複しないので、vector を set に変換してから vector に直せばよいのではないかと考えました。 python ならこの考え方でlist(sort())とします。

こちらの方法でも重複が削除できるようです。

おそらく利点は、sort 関数を持たないコンテナに対して重複削除を行いたいときに sort関数を用意する必要がないことではないかと思いますが、検証していません。

おわりに

python では listの重複削除は list(set()) とするので、c++の流儀がわからず調べました。

コメント

タイトルとURLをコピーしました