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

C++ STLのlist::merge()関数とは?使い方とサンプルコードを解説

本記事では、C++ STLのlist::merge()関数について、その動作・構文・具体的な使用例を詳しく解説します。

STLにおけるlist(リスト)とは?

listは、シーケンス内の任意の位置に対して一定時間での挿入・削除が可能なデータ構造です。内部は双方向連結リストとして実装されており、連続しないメモリ領域への配置が許容されています。そのため、配列やvector、dequeと比較して、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセスは低速であるという特徴があります。また、listはforward_listと似ていますが、forward_listは片方向連結リストであり、前方方向にしかイテレートできない点が異なります。

list::merge()とは?

list::merge()は、C++ STLに組み込まれた関数で、<list>ヘッダーファイル内で宣言されています。merge()は、2つのリストを1つに統合するために使用されます。単純に2つのリストをマージするだけでなく、比較条件を細かく制御したい場合には、コンパレータ(比較関数)を追加することも可能です。

重要な注意点として、2つのリストをマージする前に、両方のリストがソート済みであることを確認する必要があります。コンパレータを渡さない場合は、operator< による比較で2つのリストが1つのソート済みリストに統合されます。リスト同士で独自の内部比較を行いたい場合は、コンパレータを指定する必要があります。

構文

list_container1.merge(list_container2); // 両方のリストをlist_container1にマージ
list_container1.merge(list_container2, comparator);

この関数は、1つまたは2つのパラメータを受け取ることができます。

パラメータ

  • list_container2 − マージ対象となる第2のリストのオブジェクトです。

  • comparator − 内部比較を定義します。これは二項述語(binary predicate)であり、リストコンテナに定義された値と同じ型の2つの入力を受け取ります。list_container1の要素がlist_container2の要素より先に来ると判断される場合はtrueを、そうでない場合はfalseを返します。

戻り値

この関数は何も返しません(void型です)。マージ結果は呼び出し元のリスト(list_container1)に直接反映されます。

コンパレータなしの場合

以下のコードでは、2つのソート済みリストを作成し、それらをマージします。マージ後の出力もソートされた状態になっている必要があります。

#include <bits/stdc++.h>
using namespace std;
int main(){
    // ソート済みリストを作成
    list<int> myList_1 = {2, 4, 6, 8 };
    list<int> myList_2 = {1, 3, 5, 7 };
    // merge()関数を使ってリストをマージ
    myList_2.merge(myList_1);
    cout << "Lists after merging : ";
    for(auto i = myList_2.begin(); i != myList_2.end(); ++i)
        cout << *i << " ";
    return 0;
}

出力

上記のコードを実行すると、以下のような出力が生成されます。

Lists after merging : 1 2 3 4 5 6 7 8

コンパレータありの場合

以下のコードでは、2つのリストをマージし、最終的な出力として生成されたリストをソートします。

#include <bits/stdc++.h>
using namespace std;
bool compare(int myList_1, int myList_2){
    return ( int(myList_1)<int(myList_2) );
}
int main(){
    // リストを作成
    list<int> myList_1 = {2, 4, 1 };
    list<int> myList_2 = {7, 6, 5 };
    myList_1.sort();
    myList_2.sort();
    // merge()関数を使ってリストをマージ
    myList_1.merge(myList_2);
    myList_2.push_back(3);
    myList_1.merge(myList_2, compare);
    cout << "List Elements are : ";
    for(auto i = myList_1.begin(); i != myList_1.end(); ++i)
        cout << ' ' << *i;
    return 0;
}

出力

上記のコードを実行すると、以下のような出力が生成されます。

List Elements are : 1 2 3 4 5 6 7
  1. C++ STLのlist::reverse()関数の使い方と実例解説

    本記事では、C++におけるlist::reverse()関数の動作、構文、具体的な使用例について詳しく解説します。STLにおけるlistとはlistは、シーケンス内の任意の位置で定数時間O(1)での要素の挿入・削除を可能にするデータ構造です。listは双方向連結リストとして実装されており、メモリの非連続的な割り当てが可能です。配列、vector、dequeと比較すると、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅いという特徴があります。listはforward_listと似ていますが、forwar

  2. C++STLのlist back()関数の使い方を解説

    C++のlist back()関数とは本記事では、C++におけるlist back()関数の動作について詳しく解説します。list::back()関数は、C++標準テンプレートライブラリ(STL)の一部であり、リストの最後(末尾)の要素を取得・表示するために使用されます。この関数を呼び出す前に、必ず<list>ヘッダーファイルをインクルードする必要がある点に注意してください。構文List_Name.back();パラメータこの関数は、いかなるパラメータも受け取りません。戻り値この関数は、リストの最後の要素の値を返します。なお、リストが空の場合の動作は未定義となるため、呼び出し前にリ