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

C++のSTLを使って2つの配列の共通要素を求める方法

このチュートリアルでは、C++のSTL(標準テンプレートライブラリ)を使用して、2つの配列に共通する要素を見つける方法について解説します。

2つの配列の共通要素を求めるには、set_intersection()メソッドを使用します。この関数は、あらかじめソートされた2つの範囲を受け取り、双方に存在する要素だけを出力先のコンテナへコピーします。そのため、呼び出し前に必ずsort()などで配列を昇順に並べておく必要があります。

サンプルコード

#include <bits/stdc++.h>
using namespace std;
int main(){
    // 配列の定義
    int arr1[] = { 1, 45, 54, 71, 76, 12 };
    int arr2[] = { 1, 7, 5, 4, 6, 12 };
    int n1 = sizeof(arr1) / sizeof(arr1[0]);
    int n2 = sizeof(arr2) / sizeof(arr2[0]);
    sort(arr1, arr1 + n1);
    sort(arr2, arr2 + n2);
    cout << "First Array: ";
    for (int i = 0; i < n1; i++)
        cout << arr1[i] << " ";
    cout << endl;
    cout << "Second Array: ";
    for (int i = 0; i < n2; i++)
        cout << arr2[i] << " ";
    cout << endl;
    vector<int> v(n1 + n2);
    vector<int>::iterator it, st;
    // 共通要素の検索
    it = set_intersection(arr1, arr1 + n1, arr2, arr2 + n2, v.begin());
    cout << "\nCommon elements:\n";
    for (st = v.begin(); st != it; ++st)
        cout << *st << ", ";
    cout << '\n';
    return 0;
}

実行結果

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

コードのポイント

  • 事前のソートが必須: set_intersection()はソート済みの範囲を前提として動作するため、まずsort()で両方の配列を昇順に並べ替えています。
  • 結果格納用のvector: 共通要素の数は最大でも小さい方の配列の要素数以下ですが、ここでは余裕を持ってn1 + n2のサイズでvectorを確保しています。
  • 戻り値の活用: set_intersection()は結果の末尾を指すイテレータを返します。v.begin()からこの戻り値までの範囲が、実際に格納された共通要素となります。

なお、重複した要素が配列内に存在する場合、set_intersection()はその最小の出現回数分だけ結果に含める点にも注意してください。

  1. C++で行列の2つの対角線の合計の差を求める方法

    本記事では、与えられた行列における2つの対角線(主対角線と副対角線)の要素の合計の差を求める方法について解説します。N×Nの正方行列が与えられたとき、まず主対角線と副対角線それぞれの合計を計算し、その差の絶対値を求めて結果として返します。アルゴリズムの考え方主対角線(左上から右下へ向かう対角線)では、行インデックスと列インデックスが同時に増加していきます。つまり、matrix[i][i] の要素を順に加算することで合計を求められます。一方、副対角線(右上から左下へ向かう対角線)では、行インデックスと列インデックスの間に「row_index = n − 1 − col_index」という関係が成

  2. C++で2つの配列の合計を等しくする要素スワップのペアを見つける方法

    要素数が異なる2つの配列があるとします。このとき、1つ目の配列に含まれる要素 x と、2つ目の配列に含まれる要素 y からなるペアを見つけます。このペアを選んで2つの配列間で要素を入れ替えた結果、両方の配列の合計が等しくなるようにするのが目的です。例として、配列 A が [4, 1, 2, 2, 1, 1]、配列 B が [3, 3, 6, 3] を持っている場合を考えてみましょう。A の合計は 11、B の合計は 15 です。ここで (1, 3) というペアを選び、これらの値を2つの配列間で入れ替えると、合計は次のようになります。A: [4, 3, 2, 2, 1, 1] → 合計 13B: