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

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

本記事では、C++ STLにおける forward_list::before_begin() 関数の動作、構文、具体的な使用例について詳しく解説します。

STLにおけるforward_listとは?

forward_list(前方リスト)は、シーケンス内の任意の位置に対して定数時間での挿入・削除操作を可能にするシーケンスコンテナです。内部的には単方向リンクリストとして実装されており、各要素が次の要素へのリンクを持つことで順序が維持されます。双方向リンクリストである std::list と異なり、逆方向への走査はできませんが、その分メモリ効率に優れています。

forward_list::before_begin()とは?

forward_list::before_begin() は、C++ STLの組み込み関数であり、<forward_list> ヘッダーファイル内で宣言されています。この関数は、forward_listコンテナの先頭要素の直前の位置を指すイテレータを返します。

forward_listは単方向リンクリストであるため、要素の挿入には「指定位置の後」に挿入する insert_after() を使います。したがって、リストの先頭に新しい要素を挿入したい場合には、先頭より前の位置を指すこの before_begin() が不可欠になります。

構文

forwardlist_container.before_begin();

この関数は引数を受け取りません。

戻り値

シーケンスの先頭より前の位置を指すイテレータを返します。なお、このイテレータは逆参照(デリファレンス)できない点に注意してください。あくまで insert_after() などで挿入位置を指定するために使用します。

使用例1:before_begin()とinsert_after()の組み合わせ

以下のコードでは、forward_listを作成し、before_begin() 関数で先頭より前の位置を取得した後、insert_after() 関数を使ってリストの先頭に新しい要素を挿入しています。

#include <bits/stdc++.h>
using namespace std;
int main() {
    // forward_listの作成と初期化
    forward_list<int> forwardList = { 3, 6, 1, 2, 4 };
    // before_begin関数を呼び出して先頭前の位置を取得
    auto i = forwardList.before_begin();
    // リストの先頭に要素を挿入
    forwardList.insert_after(i, 7);
    cout << "forward_listの要素:" << endl;
    for (auto j = forwardList.begin(); j != forwardList.end(); ++j)
        cout << *j << " ";
    return 0;
}

出力結果

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

forward_listの要素:
7 3 6 1 2 4

新しく挿入された「7」がリストの先頭に追加されていることが確認できます。

使用例2:一行で先頭に要素を挿入する

before_begin() の戻り値を直接 insert_after() に渡すことで、より簡潔に記述することもできます。

#include <bits/stdc++.h>
using namespace std;
int main() {
    forward_list<int> forwardList = {2, 23, 12, 11};
    // before_begin()の戻り値を直接渡して先頭に挿入
    forwardList.insert_after(forwardList.before_begin(), 19);
    cout << "forward_listの要素: ";
    for (auto j = forwardList.begin(); j != forwardList.end(); ++j)
        cout << *j << " ";
    return 0;
}

出力結果

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

forward_listの要素: 19 2 23 12 11

まとめ

forward_list::before_begin() は、forward_listの先頭要素の直前の位置を指すイテレータを取得するための関数です。単方向リンクリストであるforward_listでは push_front() の代わりに insert_after(before_begin(), 値) の形式で先頭への挿入を行うのが一般的なパターンとなります。計算量はO(1)で、非常に効率的に動作します。

  1. C++ STLのmap::max_size()関数の使い方とサンプルコードを解説

    本記事では、C++ STLにおけるmap::max_size()関数の動作、構文、および具体的な使用例について詳しく解説します。 C++ STLにおけるマップ(map)とは? マップは連想コンテナの一種で、キー値とマップされた値の組み合わせからなる要素を特定の順序で格納することができます。マップコンテナ内のデータは、内部的に常に対応するキーに基づいてソートされます。また、マップコンテナ内の値には、一意なキーを通じてアクセスします。 map::max_size()とは何か? map::max_size()関数は、C++ STLに組み込まれている関数であり、<map>ヘッダファイルで定

  2. C++ STLのスタック(stack)徹底解説!LIFO構造の基本操作とサンプルコード

    C++ STLにおけるスタック(stack)は、LIFO(Last In First Out:後入れ先出し)構造として実装されるコンテナです。LIFOとは「最後に入れたものが最初に取り出される」という意味で、本を一冊ずつ積み上げた山をイメージすると理解しやすいでしょう。一番上に置いた本(=最後に挿入された要素)が最初に取り出されることから、この構造はLIFOと呼ばれています。 スタックで使える主な操作 1. top() – 最上位要素の取得 スタックの最上位(先頭)にある要素への参照を返します。要素自体は削除されません。 構文:name_of_stack.top() 引数:なし 戻り値:ス