vectorとlistはC++標準テンプレートライブラリ(STL)で提供されるコンテナであり、それぞれ異なる特性を持っています。ここではそれらの主な違いを説明します。
メモリ構造
- list: 双方向リストとして実装されており、メモリ領域は非連続です。
- 長所: 挿入や削除が効率的です。データの移動は不要で、ポインタの変更のみで処理が可能です。
- 短所: 要素の検索に時間がかかります。時間計算量はO(n)です。
- vector: 連続したメモリ領域を使用し、配列に似ています。
- 長所: ランダムアクセスが可能で、時間計算量はO(1)です。
- 短所: 挿入や削除時にはデータのコピーが必要となり、時間計算量はO(n)になります。
イテレータ操作
listとvectorのイテレータにはいくつかの違いがあります。
- listのイテレータは加算(+)、代入(+=)、比較(<)などの演算をサポートしていませんが、vectorはサポートしています。
- 両方とも++演算子をサポートしています。
listでのイテレーション例
方法1
#include <iostream>
#include <list>
int main() {
std::list<int> intList;
for (int i = 0; i < 10; ++i) {
intList.push_back(i);
}
for (auto it = intList.begin(); it != intList.end(); ++it) {
std::cout << "要素: " << *it << std::endl;
}
return 0;
}
方法2
#include <iostream>
#include <list>
int main() {
std::list<int> intList;
for (int i = 0; i < 10; ++i) {
intList.push_back(i);
}
for (const auto& value : intList) {
std::cout << "要素: " << value << std::endl;
}
return 0;
}
listの常用関数
listには以下の主要な関数が存在します。
list(): 空のリストを作成します。list(n): n個のデフォルト値を持つ要素からなるリストを作成します。list(n, val): n個のvalで初期化された要素を持つリストを作成します。list(first, last): イテレータfirstとlastによって指定された範囲の要素を持つリストを作成します。begin() / end(): リストの先頭および末尾の次の位置を指すイテレータを返します。push_back() / push_front(): リストの末尾または先頭に要素を追加します。empty(): リストが空かどうかを判定します。resize(): リストのサイズを変更します。必要に応じて要素を追加または削除します。clear(): リスト内の全要素を削除します。front() / back(): リストの最初および最後の要素への参照を返します。pop_back() / pop_front(): リストの末尾または先頭の要素を削除します。assign(): リストの内容を再設定します。swap(): 二つのリストの内容を入れ替えます。reverse(): リストの順序を逆転させます。merge(): 二つのリストをマージし、昇順にソートします。