C++
 Computer >> コンピューター >  >> プログラミング >> C++

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()を使い分けることで、より柔軟なデータ操作が可能になります。

  1. 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,

  2. C++ STLを使ってカスタムオブジェクトのvectorをソートする方法

    C++では、STLが提供するstd::sort関数を使うことで、カスタムオブジェクトのvector(可変長配列)を簡単に並べ替えることができます。sort関数には、引数として「first(先頭イテレータ)」「last(末尾イテレータ)」「comparator(比較用の述語関数)」を受け取るオーバーロード版があります。firstとlastにはコンテナの最初と最後の要素を指すイテレータを渡し、comparatorにはコンテナをどのようにソートするかを指示する述語関数を指定します。 サンプルコード #include<iostream> #include<algorithm>