C++ STLのforward_list::emplace_after()とemplace_front()の使い方を徹底解説
本記事では、C++におけるforward_list::emplace_after()とforward_list::emplace_front()関数の動作について詳しく解説します。
forward_listは、前後双方向に走査できる通常のリスト(std::list)とは異なり、次の要素とのリンクのみを保持する片方向リンクリストです。そのため前方方向にしかイテレーションできませんが、その分メモリ効率に優れています。
forward_list::emplace_after()とforward_list::emplace_front()はC++標準ライブラリの一部であり、利用するには<forward_list>ヘッダーファイルをインクルードする必要があります。
forward_list::emplace_after()
forward_list::emplace_after()関数は、引数で指定された位置にある要素の直後に新しい要素を挿入するために使用されます。要素はその場で直接構築されるため、余計なコピーが発生せずパフォーマンス面でも有利です。
構文
Forward_List_Name.emplace_after(iterator, element);
パラメータ
この関数は以下の2つの引数を受け取ります。
- iterator: 新しい要素を挿入する基準となる位置を指すイテレータ。この位置の直後に要素が挿入されます。
- element: 挿入したい要素。
戻り値
挿入された新しい要素を指すイテレータを返します。
forward_list::emplace_front()
forward_list::emplace_front()関数は、リストの先頭に新しい要素を挿入するために使用されます。
構文
Forward_List_Name.emplace_front(element);
パラメータ
この関数は1つの引数(挿入する要素)を受け取ります。
戻り値
戻り値はありません(void型)。
使用例
入力: 11, 34, 56 出力: 41 11 34 56
説明:
ここでは、要素11、34、56を持つforward_list「Lt」を作成しました。続いて、リストの先頭に新しい要素を挿入するemplace_front()関数を呼び出し、ここでは41を挿入しています。
そのため、forward_listを出力すると、先頭が41となった「41 11 34 56」という結果が得られます。
プログラムの手順
- まず、int型のforward_list(例:「Lt」)を作成し、いくつかの値で初期化します。
- 次に、
emplace_front()関数を呼び出して、リストの先頭に新しい要素を追加します。 - 続いて、auto型のオブジェクト(例:「itr」)を作成します。これは
emplace_after()に渡す位置を保持するイテレータとして機能し、新しい要素はこの位置の直後に挿入されます。 - 最後に、
emplace_after()関数を呼び出して指定位置に要素を挿入します。第1引数にはリスト内の位置を示すイテレータ「itr」を、第2引数には挿入する要素を渡します。
アルゴリズム
Start
Step 1-> main()関数内で
forward_list<int> Lt = {5,6,7,8} を初期化
Lt.emplace_front(3) を呼び出して先頭に要素を追加
イテレータ itr を末尾要素の位置に設定
Lt.emplace_after(itr, 10) を呼び出して指定位置の後ろに要素を追加
リストの内容を表示して終了
Stop
サンプルコード
#include <iostream>
#include <forward_list>
using namespace std;
int main() {
forward_list<int> Lt = { 5, 6, 7, 8 };
// emplace_front()を使って先頭に要素を追加
Lt.emplace_front(3);
// 末尾要素(8)を指すイテレータを取得
auto itr = Lt.begin();
for (int i = 0; i < 4; ++i) {
++itr;
}
// emplace_after()を使って指定位置の後ろに要素を追加
Lt.emplace_after(itr, 10);
// リストの内容を表示
for (auto it = Lt.begin(); it != Lt.end(); ++it) {
cout << *it << " ";
}
return 0;
}
出力
上記のコードを実行すると、以下の出力が得られます。
3 5 6 7 8 10
まとめ
emplace_front()はリストの先頭への要素追加に、emplace_after()は任意の位置の直後への要素追加にそれぞれ使用できます。どちらも要素を直接構築するため、一時オブジェクトの生成やコピーのコストを抑えられる点が大きな特徴です。片方向リンクリストであるforward_listを効率的に扱うために、ぜひ活用してみてください。
-
C++ STLのlistにおけるcrbegin()・crend()関数の使い方を解説
C++のSTL(標準テンプレートライブラリ)には、リストを逆方向に走査するための便利なメンバ関数が用意されています。本記事では、list::crbegin()とlist::crend()の2つの関数の動作について詳しく解説します。これらの関数はC++標準テンプレートライブラリの一部であり、使用するには<list>ヘッダーをインクルードする必要があります。list::crbegin()とはlist::crbegin()は、リストの逆先頭(つまりリストの末尾要素)を指す定数リバースイテレータを返します。この関数を使うと、リストを末尾から先頭へ向かって辿ることができますが、イテレータを通
-
C++ STLのstd::arrayで使えるget()関数の使い方を徹底解説
この記事では、C++ STLのstd::arrayコンテナに用意されているget()関数について詳しく解説します。この関数は、配列コンテナ内のi番目の要素を取得するために使用される便利な非メンバ関数です。 構文 get<i> array_name get()関数は、2つの必須パラメータを受け取ります。 1つ目はインデックスパラメータで、配列のi番目の位置を指定します。ここにはテンプレート引数として整数の定数を渡します。 2つ目は配列名(array_name)で、実際に要素を取り出す対象となる配列そのものです。 この関数は、指定されたi番目の要素への参照を返します。 なお、get()