C++でSTLのset_union()を使って2つのベクトルを結合する方法
このチュートリアルでは、C++のSTL(標準テンプレートライブラリ)を活用して、与えられた2つのベクトル(vector)を結合する方法を解説します。
2つのベクトルを結合するには、STLが提供するset_union()関数を使用します。set_union()は、2つのソート済み範囲の「和集合」を計算し、共通する要素を重複なく1つにまとめた結果を出力先へ書き込む関数です。
set_union()を使うときの注意点
set_union()で正確な結果を得るには、入力となる両方のベクトルがあらかじめソートされていることが前提です。そのため、結合処理の前にsort()を呼び出して、各ベクトルを昇順に整列させておきましょう。
サンプルコード
#include <bits/stdc++.h>
using namespace std;
int main() {
// 2つのベクトルを用意
vector<int> vector1 = { 1, 45, 54, 71, 76, 12 };
vector<int> vector2 = { 1, 7, 5, 4, 6, 12 };
// 和集合を求める前に、それぞれのベクトルをソート
sort(vector1.begin(), vector1.end());
sort(vector2.begin(), vector2.end());
cout << "First Vector: ";
for (int i = 0; i < vector1.size(); i++)
cout << vector1[i] << " ";
cout << endl;
cout << "Second Vector: ";
for (int i = 0; i < vector2.size(); i++)
cout << vector2[i] << " ";
cout << endl;
// 結果を格納するためのベクトル(2つのサイズの合計分を確保)
vector<int> v(vector1.size() + vector2.size());
vector<int>::iterator it, st;
// set_union()で2つのベクトルの和集合を求める
it = set_union(vector1.begin(), vector1.end(),
vector2.begin(), vector2.end(), v.begin());
cout << "\nAfter joining:\n";
for (st = v.begin(); st != it; ++st)
cout << *st << ", ";
cout << '\n';
return 0;
}
実行結果
First Vector: 1 12 45 54 71 76 Second Vector: 1 4 5 6 7 12 After joining: 1, 4, 5, 6, 7, 12, 45, 54, 71, 76,
コードのポイント
- 事前のソートが必須:set_union()はソート済みの範囲を前提とするため、呼び出し前にsort()を実行しています。
- 結果格納用の領域を確保:出力先のベクトルvは、2つのベクトルのサイズを足した分だけ事前に確保しておきます。
- 戻り値の活用:set_union()は構築した範囲の末尾の次を指すイテレータを返すため、これを使えば有効な要素だけを効率よく出力できます。
- 重複は自動的に除去:両方のベクトルに含まれる要素(例:1や12)は、結果に1回だけ現れます。
補足:単純に連結したい場合
重複を取り除かず、単純に2つのベクトルをつなげたいだけであれば、insert()を使う方法が便利です。
vector1.insert(vector1.end(), vector2.begin(), vector2.end());
このように、目的に応じてset_union()とinsert()を使い分けることで、より柔軟なデータ操作が可能になります。
-
C++で多次元配列を使って2つの行列を乗算する方法【サンプルコード付き】
行列とは行列(マトリックス)とは、数値を行と列の形式で長方形状に配置した配列のことです。例えば、3行3列からなる3×3行列は以下のように表されます。8 6 3 7 1 9 5 1 9この記事では、多次元配列を使用して2つの行列の積を計算するC++プログラムを紹介します。行列乗算プログラムの全体コード2つの行列を掛け合わせるC++プログラムは以下の通りです。サンプルコード#include<iostream> using namespace std; int main() { int product[10][10], r1=2, c1=3, r2=3, c2=3, i, j,
-
C++ STLを使ってカスタムオブジェクトのvectorをソートする方法
C++では、STLが提供するstd::sort関数を使うことで、カスタムオブジェクトのvector(可変長配列)を簡単に並べ替えることができます。sort関数には、引数として「first(先頭イテレータ)」「last(末尾イテレータ)」「comparator(比較用の述語関数)」を受け取るオーバーロード版があります。firstとlastにはコンテナの最初と最後の要素を指すイテレータを渡し、comparatorにはコンテナをどのようにソートするかを指示する述語関数を指定します。 サンプルコード #include<iostream> #include<algorithm>