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

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

本記事では、C++標準ライブラリにおけるforward_list::swap()関数の動作について詳しく解説します。2つのforward_listの内容を効率よく入れ替える方法を、構文・手順・サンプルコード・実行結果とともに見ていきましょう。

forward_list(フォワードリスト)とは?

forward_listは、シーケンス内の任意の位置に対して定数時間(O(1))での挿入・削除操作が可能なシーケンスコンテナです。内部的には単方向リンクリストとして実装されており、各要素が次の要素へのリンクを持つことで、シーケンスの順序が維持されます。

双方向の走査が必要ない場合、forward_listはstd::listよりもメモリ効率が良く、高速に動作するという特徴があります。

forward_list::swap()とは?

forward_list::swap()は、C++標準ライブラリに用意されている関数の一つで、同じデータ型の2つのforward_listの内容を入れ替える(スワップする)ために使用されます。要素を一つずつコピーするのではなく、内部のポインタ(リンク)を付け替えるだけなので、リストのサイズに関わらず非常に高速に処理できます。

構文

swap()には、メンバ関数として呼び出す方法と、非メンバ関数として呼び出す方法の2通りがあります。

// メンバ関数として呼び出す場合
forward_list1.swap(forward_list2)

または

// 非メンバ関数(std::swap)として呼び出す場合
swap(forward_list1, forward_list2)

どちらの形式でも結果は同じになります。

実行イメージ

出力 – 最初のリスト : 57 99 54 34 84
    2番目のリスト : 45 65 78 96 77
    スワップ操作後の出力は以下の通りです
    最初のリスト : 45 65 78 96 77
    2番目のリスト : 57 99 54 34 84

このように、swap()を実行すると2つのリストの内容が完全に入れ替わります。

処理の手順

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

  • 初期化した2つのリストの内容を出力します。

  • swap()関数を呼び出して、リスト同士の内容を入れ替えます。

  • スワップ後のリストの内容を出力して確認します。

以上の手順に従うことで、2つのforward_listの内容を簡単に入れ替えることができます。

アルゴリズム

処理の流れは以下の通りです。

STEP 1 – 2つのforward_listを初期化し、内容を出力する
    最初のリスト: forward_list<int> list1 = { 10, 20, 30, 40, 50 };
    for(auto x = list1.begin(); x != list1.end(); ++x)
        cout << *x << " ";
    2番目のリスト: forward_list<int> list2 = { 40, 30, 20, 10, 50 };
    for(auto x = list2.begin(); x != list2.end(); ++x)
        cout << *x << " ";
END

STEP 2 – swap関数を呼び出してスワップ操作を行う
    swap(list1, list2);
END

Stop

サンプルコード

// forward_list::swap() の動作を示すC++コード
#include <iostream>
#include <forward_list>
using namespace std;

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

    forward_list<int> list2 = { 40, 30, 20, 10, 50 };
    cout << "List2の要素: ";
    for(auto x = list2.begin(); x != list2.end(); ++x)
        cout << *x << " ";
    cout << endl;

    // スワップ操作を行う関数の呼び出し
    swap(list1, 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 30 20 10 50
    スワップ後のList1 : 40 30 20 10 50
    スワップ後のList2 : 10 20 30 40 50

別の値でも試してみましょう。

出力 – List1の要素 : 23 56 78 49 11
    List2の要素 : 11 49 78 56 23
    スワップ後のList1 : 11 49 78 56 23
    スワップ後のList2 : 23 56 78 49 11

まとめ

forward_list::swap()を使えば、同じ型の2つのforward_listの内容を一瞬で入れ替えることができます。要素のコピーが発生しないためパフォーマンス面でも優れており、大量のデータを扱う場合にも安心して利用できます。ぜひ実際のコードで試してみてください。

  1. C++ STLのforward_list::cend()関数の使い方を徹底解説

    C++標準テンプレートライブラリ(STL)のforward_list::cend()関数の働きについて解説します。 通常のlistは前後両方向の要素へのリンクを保持しているため双方向の走査が可能ですが、forward_listは次の要素へのリンクのみを保持しており、前方方向にしか走査できません。 forward_list::cend()はC++標準テンプレートライブラリの一部であり、リストの末尾要素の直後(過去末尾)を指す定数イテレータを取得するために使用されます。このイテレータは実際の要素を指すものではなく、走査範囲の終端を示すマーカーとして機能します。 この関数を呼び出すには、<fo

  2. C++STLのforward_list::cbegin()関数の使い方を徹底解説

    この記事では、C++のforward_list::cbegin()関数の動作について詳しく解説します。 forward_listは、通常のlistコンテナと異なり、次の要素へのリンクのみを保持する単方向連結リストです。通常のlistは前後の要素双方とリンクしているため双方向の走査が可能ですが、forward_listは前方方向にしかイテレートできません。その代わり、メモリ消費が抑えられ軽量であるという利点があります。 forward_list::cbegin()関数はC++標準テンプレートライブラリ(STL)の一部であり、リストの最初の要素を指すイテレータを取得するために使用されます。この関数