C++ STLのlistに要素を挿入する方法(先頭・末尾・任意の位置)
C++のSTL(標準テンプレートライブラリ)には、双方向リンクリストを実装した std::list が用意されています。この記事では、すでにいくつかの要素が格納されたリストに、新しい要素を挿入する方法を解説します。挿入できる位置は「先頭」「末尾」「任意の位置」の3パターンです。
要素の挿入方法の概要
- 先頭に挿入する場合:
push_front()を使用します。 - 末尾に挿入する場合:
push_back()を使用します。 - 任意の位置に挿入する場合:イテレータを初期化し、目的の位置まで移動させてから
insert()を呼び出します。
それでは、実際のコードを見ながら具体的な使い方を確認していきましょう。
サンプルコード
#include<iostream>
#include<list>
using namespace std;
void display(list<int> my_list){
for (auto it = my_list.begin(); it != my_list.end(); ++it)
cout << *it << " ";
}
int main() {
int arr[] = {10, 41, 54, 20, 23, 69, 84, 75};
int n = sizeof(arr)/sizeof(arr[0]);
list<int> my_list;
for(int i = 0; i<n; i++){
my_list.push_back(arr[i]);
}
cout << "List before insertion: ";
display(my_list);
// 先頭に100を挿入
my_list.push_front(100);
// 末尾に500を挿入
my_list.push_back(500);
// インデックス5の位置に1000を挿入
list<int>::iterator it = my_list.begin();
advance(it, 5);
my_list.insert(it, 1000);
cout << "\nList after insertion: ";
display(my_list);
}実行結果
List before insertion: 10 41 54 20 23 69 84 75 List after insertion: 100 10 41 54 20 1000 23 69 84 75 500
コードの解説
まず、配列の要素を push_back() でリストに格納し、挿入前の状態を表示しています。続いて、push_front(100) で先頭に100を、push_back(500) で末尾に500を追加します。
任意の位置への挿入では、begin() で取得したイテレータを advance(it, 5) によって5要素分進めます。この時点のリストは「100 10 41 54 20 23 69 84 75 500」なので、イテレータは5番目の要素「23」を指します。insert(it, 1000) を呼び出すと、その位置の直前に1000が挿入され、「20」と「23」の間に配置されます。
実行結果からも、先頭に100、末尾に500が追加され、リストの中央付近に1000が正しく挿入されていることが確認できます。なお、list はランダムアクセスをサポートしないため、任意の位置への移動には advance() のような線形探索が必要になる点に注意してください。
-
C++のSTL listから最後の要素を削除する方法
C++では、STLのstd::listを使うことで、連結リストを手軽に扱うことができます。本記事では、リストの末尾にある最後の要素を削除する方法を解説します。 例えば、[10, 41, 54, 20, 23, 69, 84, 75]という要素を持つリストがあった場合、最後の要素は75です。この最後の要素を削除するには、std::listが提供するpop_back()メンバ関数を使用します。この関数を呼び出すだけで、リストの末尾から要素を取り除くことができます。 サンプルコード 以下のコードでは、配列の要素をリストに格納した後、pop_back()を使って最後の要素を削除し、削除前後のリストの内
-
C++ STLにおけるemplace()とinsert()の違いと使い方
C++ STLにおけるemplace操作は、オブジェクトの不要なコピーを回避し、insert操作よりも効率的に要素を挿入できる点が大きな特徴です。insert操作は既存オブジェクトへの参照を受け取るため、コンテナに挿入する際にコピー(またはムーブ)が発生します。一方、emplaceは渡された引数をコンテナ内で直接オブジェクトとして構築するため、余分なコストを抑えられます。emplaceとinsertの違いemplace(): 引数をコンテナに転送し、コンテナ内で直接オブジェクトを構築します(in-place構築)。一時オブジェクトの生成やコピーが不要なため効率的です。insert(): 既存の