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

C++のSTL pairを使って、別の配列の値に基づいて配列を連動してソートする方法

2つの異なる配列があるとします。C++ STLのpairクラスを利用すると、一方の配列の値を基準にして、もう一方の配列を連動させてソートすることができます。例えば、A1 = [2, 1, 5, 4, 9, 3, 6, 7, 10, 8]、A2 = [A, B, C, D, E, F, G, H, I, J] という2つの配列を用意した場合、実行結果は次のようになります。

A1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
A2 = [B, A, F, D, C, G, H, J, E, I]

基本的な考え方

ここではC++ STLのpair(ペア)を使用します。A1の要素をfirst(第一要素)、A2の要素をsecond(第二要素)として1つのペアを作成し、それらをまとめた配列に対してsort関数を適用します。重要なポイントは、ソートの基準となる配列の要素をペアのfirst側に配置することです。pairはデフォルトでfirstを優先的に比較するため、これにより基準配列の順序に従って両方の配列が同時に並べ替えられます。

サンプルコード

#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
template <class T>
void display(T arr[], int n) {
    for (int i = 0; i < n; i++)
    cout << arr[i] << " ";
}
void sortUsingSecondArr(int A1[], char A2[], int n){
    pair<int, char> pair_arr[n];
    for (int i = 0; i < n; i++) {
        pair_arr[i].first = A1[i];
        pair_arr[i].second = A2[i];
    }
    sort(pair_arr, pair_arr + n);
    for (int i = 0; i < n; i++) {
        A1[i] = pair_arr[i].first;
        A2[i] = pair_arr[i].second;
    }
}
int main() {
    int n = 10;
    int A1[] = {2, 1, 5, 4, 9, 3, 6, 7, 10, 8};
    char A2[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
    cout << "Before Sorting: "<<endl;
    cout << "First Array : "; display(A1, n);
    cout << "\nSecond Array: "; display(A2, n);
    sortUsingSecondArr(A1, A2, n);
    cout << "\n\nAfter Sorting: "<<endl;
    cout << "First Array : "; display(A1, n);
    cout << "\nSecond Array: "; display(A2, n);
}

実行結果

Before Sorting:
First Array : 2 1 5 4 9 3 6 7 10 8
Second Array: A B C D E F G H I J
After Sorting:
First Array : 1 2 3 4 5 6 7 8 9 10
Second Array: B A F D C G H J E I

コードの解説

sortUsingSecondArr関数では、まずA1とA2の対応する要素を組み合わせて、pair<int, char>型の配列pair_arrを構築します。次に、STLのsort関数でこの配列をソートします。pairの比較ではfirstが優先されるため、A1の値が昇順に並べ替えられ、A2の要素もそれぞれ対応する位置に連動して移動します。最後に、ソート済みの値を元の配列A1とA2に書き戻しています。

なお、このサンプルでは可変長配列(VLA)である pair_arr[n] を使用しているため、コンパイラによってはC++の標準規格としてサポートされない点に注意が必要です。移植性を高めたい場合は、std::vector<std::pair<int, char>> を使うか、new/deleteによる動的確保を利用する方法が推奨されます。また、降順でソートしたい場合は、sort関数の第3引数に greater<pair<int, char>>() を指定するだけで対応できます。

  1. C++で1次元配列を使って2次元配列をエミュレートする方法|行優先・列優先のインデックス変換を解説

    はじめに本記事では、2次元配列を1次元配列へ変換する方法について解説します。2次元配列の各要素を、どのように1次元配列へ格納すればよいのかを具体的に見ていきましょう。ここで用意する1次元配列のサイズは、2次元配列の全要素数である「n × m」と同じになります。プログラミングにおいて、2次元配列を1次元配列へ格納する方式は主に次の2つがあります。行優先(Row Major)列優先(Column Major)行優先(Row Major)とは行優先方式では、まず1行目の要素をすべて順番に格納し、その後に次の行へ移動していきます。C++をはじめ、CやPythonなど多くの言語では、この行優先が標準的な

  2. C++のSTLを使って配列が回文かどうかを判定するプログラム

    整数 n 個からなる配列 arr[n] が与えられたとき、「その配列は回文(パリンドローム)か?」を判定するのが本稿のテーマです。C++ の STL(標準テンプレートライブラリ)を活用して、この問題をシンプルに解いていきます。 STLとは STL(Standard Template Library)は、C++ に用意されたテンプレートクラスの集合体で、スタック・キュー・リストといったデータ構造や、ソート・反転などの便利な関数を提供します。これらを活用するには、テンプレートクラスに関する基本的な知識が必要です。本稿では、STL の reverse() 関数を使って配列を反転させています。 回文と