C++ でベクターから重複を削除する

胡金庫 2023年10月12日
  1. std::unique および std::vector::erase 関数を使用して C++ ベクターから重複を削除する
  2. std::set コンテナを使用して、C++ ベクトルから重複を削除する
C++ でベクターから重複を削除する

この記事では、C++ でベクターから重複を削除する方法を紹介します。

std::unique および std::vector::erase 関数を使用して C++ ベクターから重複を削除する

std::unique 関数は STL アルゴリズムの一部であり、基本的に、ソートされた範囲で重複要素の削除操作を実装します。要素は削除するたびにシフトされ、関数は新しく形成された範囲の過去のイテレータを返します。次のサンプルコードで使用する std::unique オーバーロードは、範囲の開始と終了を示すために 2つのイテレータ引数を取ります。この場合、std::unique で処理される前に、指定された vectorstd::sort アルゴリズムでソートします。最後に、erase メンバー関数が呼び出され、新しく形成されたベクトルに合うように元の配列サイズが変更されます。

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::left;
using std::setw;
using std::vector;

int main() {
  vector<int> int_vec = {10,  23,  10,  324, 10, 10, 424,
                         649, 110, 110, 129, 40, 424};

  cout << left << setw(10) << "vec: ";
  copy(int_vec.begin(), int_vec.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  std::sort(int_vec.begin(), int_vec.end());
  auto last = std::unique(int_vec.begin(), int_vec.end());
  int_vec.erase(last, int_vec.end());

  cout << left << setw(10) << "vec: ";
  copy(int_vec.begin(), int_vec.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

vec:      10; 23; 10; 324; 10; 10; 424; 649; 110; 110; 129; 40; 424;
vec:      10; 23; 40; 110; 129; 324; 424; 649;

前のソリューションを実装する別の方法は、erase 呼び出しの代わりに resize 関数を使用することです。resize 関数は、ベクトルの要素数を変更します。したがって、distance 呼び出しを使用して新しく形成されたベクトル要素の計算されたカウントを渡すことができ、resize はベクトルを縮小します。

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::left;
using std::setw;
using std::vector;

int main() {
  vector<int> int_vec = {10,  23,  10,  324, 10, 10, 424,
                         649, 110, 110, 129, 40, 424};

  cout << left << setw(10) << "vec: ";
  copy(int_vec.begin(), int_vec.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  std::sort(int_vec.begin(), int_vec.end());
  auto last = std::unique(int_vec.begin(), int_vec.end());
  int_vec.resize(std::distance(int_vec.begin(), last));

  cout << left << setw(10) << "vec: ";
  copy(int_vec.begin(), int_vec.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

vec:      10; 23; 10; 324; 10; 10; 424; 649; 110; 110; 129; 40; 424;
vec:      10; 23; 40; 110; 129; 324; 424; 649;

std::set コンテナを使用して、C++ ベクトルから重複を削除する

または、std::set コンテナを使用して、ベクターから重複する要素を削除することもできます。std::set は、指定されたタイプの一意のオブジェクトを内部的に格納するため、ベクトル要素からオブジェクトを作成する必要があることに注意してください。ソートする必要のあるベクトル要素で set が初期化されたら、元の vector オブジェクトから assign 関数を呼び出して、set オブジェクトから一意の要素を格納できます。

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <set>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::left;
using std::set;
using std::setw;
using std::vector;

int main() {
  vector<int> int_vec = {10,  23,  10,  324, 10, 10, 424,
                         649, 110, 110, 129, 40, 424};

  cout << left << setw(10) << "vec: ";
  copy(int_vec.begin(), int_vec.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  set<int> int_set(int_vec.begin(), int_vec.end());
  int_vec.assign(int_set.begin(), int_set.end());

  cout << left << setw(10) << "vec: ";
  copy(int_vec.begin(), int_vec.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

vec:      10; 23; 10; 324; 10; 10; 424; 649; 110; 110; 129; 40; 424;
vec:      10; 23; 40; 110; 129; 324; 424; 649;
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Vector