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

【C++】STLのset_intersection()を使って2つのvector間の共通要素を見つける方法

この記事では、C++のSTL(標準テンプレートライブラリ)を活用して、2つのvector(ベクター)間に存在する共通要素を見つける方法を解説します。

2つのvectorから共通要素を抽出するには、set_intersection()メソッドを使用します。この関数はヘッダーで定義されており、ソート済みの2つの範囲を受け取り、両方に共通して含まれる要素を出力先の範囲へ書き込みます。

なお、set_intersection()は入力となる範囲が事前にソートされていることを前提として動作するため、呼び出し前にsort()で各vectorを並べ替えておく必要があります。また、戻り値としては出力範囲の末尾を指すイテレータが返されるため、これを利用することで実際に書き込まれた要素数を把握できます。

サンプルコード

#include <bits/stdc++.h>
using namespace std;
int main(){
    // vectorの定義
    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;
    vector<int> v(vector1.size() + vector2.size());
    vector<int>::iterator it, st;
    // 共通要素の検出
    it = set_intersection(vector1.begin(), vector1.end(), vector2.begin(), vector2.end(), v.begin());
    cout << "\nCommon elements:\n";
    for (st = v.begin(); st != it; ++st)
        cout << *st << ", ";
    cout << '\n';
    return 0;
}

このコードでは、まず2つのvectorをsort()で昇順に並べ替えています。その後、結果を受け取るためのvector vを、両方のサイズの合計分だけ確保しています。これは、共通要素の数が最大でも小さい方の要素数以下とはいえ、安全のため十分な領域を確保しておく一般的な手法です。

set_intersection()が返すイテレータitは、書き込まれた共通要素の直後の位置を指すため、v.begin()からitまでをループで走査することで、共通要素だけを表示できます。

実行結果

First Vector: 1 12 45 54 71 76
Second Vector: 1 4 5 6 7 12
Common elements:
1, 12,

実行結果から、2つのvectorに共通して含まれる要素「1」と「12」が正しく抽出できていることが確認できます。

ポイントまとめ

  • set_intersection()を使う前に、必ず両方の範囲をsort()でソートしておく。
  • 結果を受け取る出力用コンテナは、あらかじめ十分なサイズを確保しておく。
  • 戻り値のイテレータを使えば、書き込まれた共通要素の範囲を正確に特定できる。
  1. C++でvectorの全要素を合計する方法|std::accumulateの使い方を解説

    C++のvector(可変長配列)に格納された全要素の合計は、標準ライブラリのstd::accumulate関数を使うことで非常に簡単に求められます。この関数は<numeric>ヘッダーで定義されており、指定した範囲内のすべての値を、第3引数で与えた初期値へ順次加算していきます。 アルゴリズム 開始   vector型の変数vを宣言する   配列形式でvに複数の値を初期化する   「すべての要素の合計は:」と出力する   accumulate(v.begin(), v.end(), 0) を呼び出し、vの全要素の合計を計算する   合計の結果を出力する 終了 サンプルコード #

  2. STLを使ったC++のvector(ベクトル)実装プログラム

    std::vectorは、動的配列のように要素の挿入や削除に応じて自動的にサイズを変更できるコンテナで、メモリ(記憶域)の管理はコンテナ自身が行います。要素は連続したメモリ領域に配置されるため、イテレータを使ったアクセスや走査が可能です。また、先頭・中間・末尾のいずれの位置にもデータを挿入・削除できます。 使用する主な関数とその説明 v.size() : ベクトルのサイズ(現在の要素数)を返します。 v.push_back() : ベクトルの末尾に要素を挿入します。 v.pop_back() : ベクトルの末尾から要素を取り除きます。 v.capacity() : 現在ベクトルに