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

C++ STLのlist swap()関数の使い方を徹底解説

この記事では、C++ STLにおけるlistコンテナのswap()関数の機能と使い方について詳しく解説します。

STLにおけるlistとは?

listは、シーケンス内の任意の位置で定数時間での挿入と削除を可能にするコンテナです。listは双方向リンクリストとして実装されており、非連続的なメモリ割り当てを行います。配列、vector、dequeと比較して、listはコンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅いという特徴があります。listはforward_listと似ていますが、forward_listは単方向リンクリストであり、前方方向にのみイテレートできる点が異なります。

swap()関数とは?

swap()関数は、あるlistの要素を別のlistと交換するために使用されるメンバ関数です。両方のリストは同じデータ型を持っている必要があります。要素の交換は、内部のポインタを入れ替えるだけで行われるため、リストのサイズに関わらず非常に高速に処理されます。

構文

listname1.swap(listname2)

動作イメージ

入力:
List1: 50 60 80 90
List2: 90 80 70 60

スワップ操作後の出力:
List1: 90 80 70 60
List2: 50 60 80 90

入力:
List1: 45 46 47 48 49
List2: 50 51 52 53 54

スワップ操作後の出力:
List1: 50 51 52 53 54
List2: 45 46 47 48 49

実装のアプローチ

  • まず、2つのlistを初期化します。

  • 次に、2つのlistの内容を表示します。

  • その後、swap()関数を呼び出します。

  • 最後に、スワップ操作後の2つのlistを表示します。

上記のアプローチに従うことで、2つのlistの要素を簡単に交換することができます。

サンプルコード1

// C++ STLにおけるlist swap()関数の動作を示すコード
#include <iostream>
#include <list>
using namespace std;

int main() {
    // 2つのリストを初期化
    list<int> list1 = { 10, 20, 30, 40, 50 };
    cout << "List1: ";
    for (auto x = list1.begin(); x != list1.end(); ++x)
        cout << *x << " ";
    cout << endl;

    list<int> list2 = { 40, 50, 60, 70, 80 };
    cout << "List2: ";
    for (auto x = list2.begin(); x != list2.end(); ++x)
        cout << *x << " ";
    cout << endl;

    // swap()関数の呼び出し
    list1.swap(list2);

    cout << "スワップ後のList1: ";
    for (auto x = list1.begin(); x != list1.end(); ++x)
        cout << *x << " ";
    cout << endl;

    cout << "スワップ後のList2: ";
    for (auto x = list2.begin(); x != list2.end(); ++x)
        cout << *x << " ";
    cout << endl;

    return 0;
}

出力結果

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

List1: 10 20 30 40 50
List2: 40 50 60 70 80
スワップ後のList1: 40 50 60 70 80
スワップ後のList2: 10 20 30 40 50

サンプルコード2

// C++ STLにおけるlist swap()関数の動作を示すコード
#include <iostream>
#include <list>
using namespace std;

int main() {
    // 2つのリストを初期化
    list<int> list1 = { 11, 12, 13, 14, 15 };
    cout << "List1: ";
    for (auto x = list1.begin(); x != list1.end(); ++x)
        cout << *x << " ";
    cout << endl;

    list<int> list2 = { 16, 17, 18, 19, 20 };
    cout << "List2: ";
    for (auto x = list2.begin(); x != list2.end(); ++x)
        cout << *x << " ";
    cout << endl;

    // swap()関数の呼び出し
    list1.swap(list2);

    cout << "スワップ後のList1: ";
    for (auto x = list1.begin(); x != list1.end(); ++x)
        cout << *x << " ";
    cout << endl;

    cout << "スワップ後のList2: ";
    for (auto x = list2.begin(); x != list2.end(); ++x)
        cout << *x << " ";
    cout << endl;

    return 0;
}

出力結果

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

List1: 11 12 13 14 15
List2: 16 17 18 19 20
スワップ後のList1: 16 17 18 19 20
スワップ後のList2: 11 12 13 14 15

まとめ

listのswap()関数を使うことで、2つのリストの内容を効率的に交換できます。この操作は要素を1つずつコピーするのではなく、内部のポインタを入れ替えるだけなので、リストのサイズに関わらず定数時間O(1)で実行される点が大きなメリットです。同じデータ型のリスト間で要素を丸ごと入れ替えたい場合に非常に便利な関数なので、ぜひ活用してみてください。

  1. C++ STLのlist::reverse()関数の使い方と実例解説

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

  2. C++ STLのlist::assign()関数の使い方をわかりやすく解説

    本記事では、C++におけるassign()関数の動作について詳しく解説します。 list::assign()関数はC++標準テンプレートライブラリ(STL)の一部であり、リストに新しい値を代入したり、あるリストから別のリストへ値をコピーしたりするために使用されます。 この関数を呼び出すには、<list>ヘッダーファイルをインクルードする必要があります。 構文①:サイズと値を指定して代入する リストに新しい値を代入する場合の構文は以下の通りです。 List_Name.assign(size, value) 構文②:別のリストから値をコピーする あるリストから別のリストへ値をコピー