C++におけるvectorとlistの違い

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(): 二つのリストをマージし、昇順にソートします。

タグ: C++ STL Vector List

7月4日 20:51 投稿