C++ でベクターから重複を削除する
胡金庫
2023年10月12日
この記事では、C++ でベクターから重複を削除する方法を紹介します。
std::unique
および std::vector::erase
関数を使用して C++ ベクターから重複を削除する
std::unique
関数は STL アルゴリズムの一部であり、基本的に、ソートされた範囲で重複要素の削除操作を実装します。要素は削除するたびにシフトされ、関数は新しく形成された範囲の過去のイテレータを返します。次のサンプルコードで使用する std::unique
オーバーロードは、範囲の開始と終了を示すために 2つのイテレータ引数を取ります。この場合、std::unique
で処理される前に、指定された vector
を std::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;
著者: 胡金庫