C++ STLのlist insert()関数の使い方を徹底解説
本記事では、C++のSTLにおけるlistコンテナのinsert()関数の機能と使い方について詳しく解説します。
STLのlistとは
listは、シーケンス内の任意の位置に対して定数時間での挿入と削除を可能にするコンテナです。listは双方向連結リストとして実装されており、非連続的なメモリ割り当てを行います。配列、vector、dequeと比較して、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は低速です。listはforward_listと似ていますが、forward_listは単方向連結リストであり、前方方向にしかイテレートできない点が異なります。
insert()関数とは
listのinsert()関数は、リストに要素を挿入するために使用されるメンバ関数です。主な用途は以下のとおりです。
指定した位置に要素を挿入する
同じ値の要素をn個まとめて挿入する
指定した範囲の要素を一括で挿入する
構文
insert(iterator position, const value_type& val) insert(iterator position, size_type n, const value_type& value) insert(iterator position, iterator first, iterator last)
パラメータ
val − リストに挿入する新しい要素を指定します。
position − 新しい要素を挿入するコンテナ内の位置を示すイテレータを指定します。
n − 挿入する要素の個数を指定します。
first, last − 挿入する要素の範囲を示すイテレータを指定します。
戻り値
新しく挿入された最初の要素を指すイテレータを返します。
使用例
入力:List − 50 60 80 90
出力:New List − 50 60 70 80 90
入力:List − T R E N D
出力:New List − T R E N D S
実装のアプローチ
- まずlistを宣言します。
- 次にlistの内容を出力します。
- その後、insert()関数を呼び出します。
上記のアプローチにより、listに新しい要素を挿入できます。なお、挿入する要素はlistと同じデータ型である必要があります。
コード例1:単一要素の挿入
// STLのlist insert()関数の動作を示すC++コード
#include <iostream>
#include <list>
using namespace std;
int main() {
list<int> lst = { 55, 84, 38, 66, 67 };
// リストの内容を出力
cout << "List: ";
for (auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
// insert()関数で先頭に6を挿入
auto x = lst.begin();
lst.insert(x, 6);
// 挿入後の新しいリストを出力
cout << "\nNew list: ";
for (x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
return 0;
}
出力
上記のコードを実行すると、次の出力が得られます。
List: 55 84 38 66 67 New list: 6 55 84 38 66 67
コード例2:複数要素の挿入
// STLのlist insert()関数の動作を示すC++コード
#include <iostream>
#include <list>
using namespace std;
int main() {
list<char> lst = { 'F', 'B', 'U', 'A', 'R', 'Y' };
cout << "List: ";
for (auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
// insert()関数で2番目の位置に'E'を1つ挿入
auto x = lst.begin();
advance(x, 1);
lst.insert(x, 1, 'E');
// 挿入後の新しいリストを出力
cout << "\nNew List: ";
for (auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
return 0;
}
出力
上記のコードを実行すると、次の出力が得られます。
List: F B U A R Y New List: F E B U A R Y
コード例3:範囲を指定した挿入
// STLのlist insert()関数の動作を示すC++コード
#include <iostream>
#include <list>
#include <vector>
using namespace std;
int main() {
list<int> lst = { 10, 44, 34, 98, 15 };
cout << "List: ";
for (auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
// 値17を2つ持つvectorを作成
vector<int> vec(2, 17);
// vectorの範囲の要素をリストの先頭に挿入
auto x = lst.begin();
lst.insert(x, vec.begin(), vec.end());
// 挿入後の新しいリストを出力
cout << "\nNew list: ";
for (auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
return 0;
}
出力
上記のコードを実行すると、次の出力が得られます。
List: 10 44 34 98 15 New list: 17 17 10 44 34 98 15
まとめ
listのinsert()関数を使えば、指定位置への単一要素の挿入、同じ値の複数要素の一括挿入、他のコンテナからの範囲挿入を柔軟に行えます。双方向連結リストであるlistの特性を活かすことで、任意の位置への効率的な要素追加が可能になります。なお、listのイテレータは双方向イテレータのため、ランダムアクセスができない点には注意し、位置の移動にはadvance()などを利用するとよいでしょう。
-
C++ STLのlistに要素を挿入する方法(先頭・末尾・任意の位置)
C++のSTL(標準テンプレートライブラリ)には、双方向リンクリストを実装した std::list が用意されています。この記事では、すでにいくつかの要素が格納されたリストに、新しい要素を挿入する方法を解説します。挿入できる位置は「先頭」「末尾」「任意の位置」の3パターンです。要素の挿入方法の概要先頭に挿入する場合:push_front() を使用します。末尾に挿入する場合:push_back() を使用します。任意の位置に挿入する場合:イテレータを初期化し、目的の位置まで移動させてから insert() を呼び出します。それでは、実際のコードを見ながら具体的な使い方を確認していきましょう。サ
-
C++ STLにおけるemplace()とinsert()の違いと使い方
C++ STLにおけるemplace操作は、オブジェクトの不要なコピーを回避し、insert操作よりも効率的に要素を挿入できる点が大きな特徴です。insert操作は既存オブジェクトへの参照を受け取るため、コンテナに挿入する際にコピー(またはムーブ)が発生します。一方、emplaceは渡された引数をコンテナ内で直接オブジェクトとして構築するため、余分なコストを抑えられます。emplaceとinsertの違いemplace(): 引数をコンテナに転送し、コンテナ内で直接オブジェクトを構築します(in-place構築)。一時オブジェクトの生成やコピーが不要なため効率的です。insert(): 既存の