C++ STL で STL リストコンテナを使用する
-
C++ で
std::list<T>
を使用してリストコンテナオブジェクトを宣言する -
C++ で
insert()
関数を使用してリスト内の指定された場所に要素を挿入する -
C++ で
swap()
関数を使用して 2つのリストの要素を交換する -
C++ で
merge()
関数を使用して 2つのソートされたリストを 1つに結合する
この記事では、C++ で STL list
コンテナーを使用する方法に関する複数の方法を示します。
C++ で std::list<T>
を使用してリストコンテナオブジェクトを宣言する
std::list
コンテナは標準テンプレートライブラリの一部であり、任意の位置からの要素の一定時間の挿入/削除を提供するリストデータ構造を実装します。これは通常、二重にリンクされたリストとして実装され、std::forward_list
とは対照的に双方向の反復をサポートします。欠点として、std::list
には、std::vector
や std::deque
のような要素への高速ランダムアクセスが装備されていません。最初と最後の要素にアクセスするために、front
と back
の 2つの一定時間関数のみを提供します。std::list
は、次のサンプルコードに示すように、指定されたデータ型と一般的な初期化子リスト表記で初期化できます。push_back
および push_front
メソッドを使用して、リストのいずれかの側に要素を追加できます。
#include <algorithm>
#include <iostream>
#include <list>
using std::cout;
using std::endl;
using std::list;
template <typename T>
void printList(list<T> l) {
for (const auto &item : l) {
cout << item << "; ";
}
cout << endl;
}
int main() {
std::list<int> l1 = {11, 12, 13, 14};
l1.push_front(15);
printList(l1);
l1.push_back(16);
printList(l1);
return EXIT_SUCCESS;
}
出力:
15; 11; 12; 13; 14;
15; 11; 12; 13; 14; 16;
C++ で insert()
関数を使用してリスト内の指定された場所に要素を挿入する
insert()
メンバー関数を使用して、特定の位置に要素を追加できます。関数には複数のオーバーロードがあり、最初のオーバーロードは、イテレーターとオブジェクトへの参照の 2つの引数のみを取ります。指定された要素は、イテレータが指す要素の前に挿入されます。次のコードスニペットは、リスト内の特定の値を見つけて、その前に目的の要素を挿入する方法を示しています。
#include <algorithm>
#include <iostream>
#include <list>
using std::cout;
using std::endl;
using std::list;
template <typename T>
void printList(list<T> l) {
for (const auto &item : l) {
cout << item << "; ";
}
cout << endl;
}
int main() {
std::list<int> l1 = {11, 12, 13, 14};
printList(l1);
auto iter = std::find(l1.begin(), l1.end(), 13);
if (iter != l1.end()) {
l1.insert(iter, 55);
}
printList(l1);
return EXIT_SUCCESS;
}
出力:
11; 12; 13; 14;
11; 12; 55; 13; 14;
C++ で swap()
関数を使用して 2つのリストの要素を交換する
std::list
コンテナのもう 1つの便利なメンバー関数は、swap()
です。これは、リストオブジェクトの要素を、唯一の引数として渡される別のリストと交換します。この操作は個々の要素を移動またはコピーせず、すべてのイテレータ/参照は関数呼び出し後も有効なままであることに注意してください。
#include <algorithm>
#include <iostream>
#include <list>
using std::cout;
using std::endl;
using std::list;
template <typename T>
void printList(list<T> l) {
for (const auto &item : l) {
cout << item << "; ";
}
cout << endl;
}
int main() {
std::list<int> l1 = {11, 12, 13, 14};
std::list<int> l2 = {1, 2, 3, 4, 11};
cout << "l2: ";
printList(l2);
l2.swap(l1);
cout << "l2: ";
printList(l2);
return EXIT_SUCCESS;
}
出力:
l2: 1; 2; 3; 4; 11;
l2: 11; 12; 13; 14;
C++ で merge()
関数を使用して 2つのソートされたリストを 1つに結合する
または、merge
メンバー関数を使用して、2つのソートされたリストの要素を 1つに結合することもできます。両方のリストを昇順で並べ替える必要があることに注意してください。merge
はリストオブジェクトへの参照を取り、その要素は呼び出し元オブジェクトにマージされます。操作後、引数として渡されたリストオブジェクトが空になります。この関数は、次のコードサンプルに示すように、結果のリストオブジェクトの要素を昇順で並べ替えます。
#include <algorithm>
#include <iostream>
#include <list>
using std::cout;
using std::endl;
using std::list;
template <typename T>
void printList(list<T> l) {
for (const auto &item : l) {
cout << item << "; ";
}
cout << endl;
}
int main() {
std::list<int> l1 = {8, 10, 2, 4};
std::list<int> l2 = {7, 3, 9, 5, 1};
l2.sort();
l1.sort();
cout << "l2: ";
printList(l2);
l2.merge(l1);
cout << "l2: ";
printList(l2);
return EXIT_SUCCESS;
}
出力:
l2: 1; 3; 5; 7; 9;
l2: 1; 2; 3; 4; 5; 7; 8; 9; 10;