コンテナライブラリは、プログラマがキュー、リスト、スタックのような一般的なデータ構造を簡単に実装できるようにする、クラステンプレートとアルゴリズムの汎用的なコレクションです。コンテナには2つ(C++11まで)3つ(C++11から)のクラスがあります。
- シーケンスコンテナ (sequence containers)、
- 連想コンテナ (associative containers)、
- 非順序連想コンテナ (unordered associative containers)、
|
(C++11以降) |
それぞれが異なる操作のセットをサポートするように設計されています。
コンテナは、その要素のために割り当てられた記憶域を管理し、直接またはイテレータ(ポインタに似たプロパティを持つオブジェクト)を介して要素にアクセスするためのメンバ関数を提供します。
ほとんどのコンテナは、少なくともいくつかの共通のメンバ関数を持ち、機能を共有しています。特定のアプリケーションに最適なコンテナは、提供される機能だけでなく、さまざまなワークロードに対する効率にも依存します。
[編集] シーケンスコンテナ
シーケンスコンテナは、シーケンシャルにアクセスできるデータ構造を実装します。
|
|
固定サイズのインプレースな連続配列 (クラステンプレート) [編集] |
|
|
リサイズ可能な連続配列 (クラステンプレート) [編集] |
|
|
リサイズ可能、固定容量、インプレースの連続配列 (クラステンプレート) [編集] |
|
|
削除された要素のメモリを再利用するコレクション (クラステンプレート) [編集] |
|
|
両端キュー (クラステンプレート) [編集] |
|
|
単方向連結リスト (クラステンプレート) [編集] |
|
|
双方向リンクリスト (クラステンプレート) [編集] |
[編集] 連想コンテナ
連想コンテナは、高速に検索できるソート済みのデータ構造を実装します(計算量 O(log n))。
|
|
ユニークなキーのコレクション、キーによってソートされる (class template) [編集] |
|
|
キーでソートされたキーと値のペアのコレクション、キーは一意 (クラステンプレート) [編集] |
|
|
キーによってソートされたキーのコレクション (クラステンプレート) [編集] |
|
|
キーによってソートされたキーと値のペアのコレクション (クラステンプレート) [編集] |
[編集] 非順序連想コンテナ (C++11から)
非順序連想コンテナは、高速に検索できるソートされていない(ハッシュ化された)データ構造を実装します(平均計算量 O(1)、最悪計算量 O(n))。
|
|
キーによってハッシュ化されたユニークなキーのコレクション (クラステンプレート) [編集] |
|
|
キーによってハッシュ化されたキーと値のペアのコレクション、キーはユニーク (クラステンプレート) [編集] |
|
|
キーのコレクション、キーによってハッシュ化される (class template) [編集] |
|
|
キーでハッシュ化されたキーと値のペアのコレクション (クラステンプレート) [編集] |
[編集] コンテナアダプタ
コンテナアダプタは、シーケンスコンテナに対して異なるインターフェースを提供します。
|
|
コンテナをスタック(LIFOデータ構造)として提供するよう適合させる (クラステンプレート) [編集] |
|
|
キュー (FIFO データ構造) を提供するためにコンテナを適応させる (クラステンプレート) [編集] |
|
|
コンテナを優先度付きキューとして提供するよう適合させる (クラステンプレート) [編集] |
|
|
ユニークなキーのコレクションを提供するためにコンテナを適応させる、キーによってソートされる (class template) [編集] |
|
|
ユニークなキーによってソートされたキーと値のペアのコレクションを提供するために2つのコンテナを適合させる (クラステンプレート) [編集] |
|
|
コンテナを適応させ、キーでソートされたキーのコレクションを提供する (クラステンプレート) [編集] |
|
|
2つのコンテナを適応させて、キーでソートされたキーと値のペアのコレクションを提供する (クラステンプレート) [編集] |
[編集] ビュー (C++20から)
ビューは、所有権を持たない要素の配列に対する1次元または多次元のビューを操作するための柔軟な機能を提供します。
|
|
連続したオブジェクトのシーケンスに対する所有権を持たないビュー (class template) [編集] |
|
|
多次元の所有権を持たない配列ビュー (クラステンプレート) [編集] |
[編集] イテレータの無効化
読み取り専用メソッドは、イテレータや参照を無効化することはありません。コンテナの内容を変更するメソッドは、この表に要約されているように、イテレータや参照を無効化する可能性があります。
ここで、挿入とはコンテナに1つ以上の要素を追加する任意のメソッドを指し、削除とはコンテナから1つ以上の要素を削除する任意のメソッドを指します。
別途指定されない限り(明示的に、または他の関数を用いて関数を定義することによって)、コンテナをライブラリ関数に引数として渡しても、そのコンテナ内のオブジェクトへのイテレータを無効化したり、値を変更したりすることはありません。
過去終端イテレータ(past-the-end iterator)は特に注意が必要です。一般に、このイテレータは削除されていない要素への通常のイテレータであるかのように無効化されます。したがって、std::set::end は決して無効化されず、std::unordered_set::end はリハッシュ時にのみ無効化され(C++11から)、std::vector::end は(常に変更された要素の後にあるため)常に無効化されます。
1つの例外があります。std::deque の最後の要素を削除する操作は、過去終端イテレータを無効化します。これは、そのイテレータがコンテナの削除された要素(あるいは要素ですら)ではないにもかかわらずです。std::deque のイテレータに関する一般規則と合わせると、結果として std::deque::end を無効化しない唯一の変更操作は、最後の要素ではなく最初の要素を削除する操作だけです。
スレッドセーフティ
- すべてのコンテナ関数は、異なるコンテナに対して異なるスレッドから同時に呼び出すことができます。より一般的には、C++標準ライブラリ関数は、
thisポインタを含む関数の引数を介して直接または間接的にアクセス可能でない限り、他のスレッドからアクセス可能なオブジェクトを読み取りません。 - すべての const メンバ関数は、同じコンテナに対して異なるスレッドから同時に呼び出すことができます。さらに、メンバ関数
begin(), end(), rbegin(), rend(), front(), back(), data(), find(), lower_bound(), upper_bound(), equal_range(), at()、および連想コンテナを除く operator[] は、スレッドセーフティの目的上 const として振る舞います(つまり、これらも同じコンテナに対して異なるスレッドから同時に呼び出すことができます)。より一般的には、C++標準ライブラリ関数は、thisポインタを含む関数の非const引数を介して直接または間接的にアクセス可能でない限り、オブジェクトを変更しません。 - 同じコンテナ内の異なる要素は、std::vector<bool> の要素を除き、異なるスレッドによって同時に変更できます(例えば、std::future オブジェクトのベクタは、複数のスレッドから値を受け取ることができます)。
- イテレータ操作(例:イテレータのインクリメント)は、基になるコンテナを読み取りますが変更はせず、同じコンテナ上の他のイテレータに対する操作、constメンバ関数、または要素からの読み取りと同時に実行できます。イテレータを無効化するコンテナ操作はコンテナを変更するため、たとえそのイテレータが無効化されない場合でも、既存のイテレータに対するいかなる操作とも同時に実行することはできません。
- 同じコンテナの要素は、これらの要素にアクセスしないと規定されているメンバ関数と同時に変更できます。より一般的には、C++標準ライブラリ関数は、仕様で要求されない限り、引数を介して間接的にアクセス可能なオブジェクト(コンテナの他の要素を含む)を読み取りません。
- いずれの場合も、コンテナ操作(アルゴリズムやその他のC++標準ライブラリ関数も同様)は、ユーザーから見える結果が変わらない限り、内部的に並列化されることがあります(例:std::transform は並列化される可能性がありますが、シーケンスの各要素を順番に訪れると規定されている std::for_each は並列化されません)。
|
(C++11以降) |
[編集] 関数テーブル
注意:std::basic_string は標準ではコンテナとして扱われませんが、その類似性からコンテナのように振る舞います。便宜上、ここでは「疑似コンテナ」として記載しています。
|
|
- C++03に存在する関数 |
|
|
- C++11から存在する関数 |
|
|
- C++17から存在する関数 |
|
|
- C++20から存在する関数 |
|
|
- C++23から存在する関数 |
[編集] メンバ関数テーブル
- 注意:2つの異なる extract 行にある関数は、意味と構文が異なります
- ↑ 例:node_type extract(const_iterator) または node_type extract(Key&)
- ↑ 例:container_type extract() &&
[編集] 非メンバ関数テーブル
|
<, <=, >, >=, != 演算子は、それぞれ operator<=> と operator== から合成されます。
|
(C++20以降) |
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR |
適用対象 |
公開された動作 |
正しい動作 |
| LWG 51
|
C++98 |
コンテナのイテレータが無効化される可能性がある 任意のライブラリ操作によって |
イテレータは無効化されるのは 指定された場合のみ |
[編集] 関連項目
C++ 名前付き要件
|
|
数値配列、配列マスク、および配列スライス (クラステンプレート) [編集] |
|
|
文字のシーケンスを格納し操作する (クラステンプレート) [編集] |
|
|
読み取り専用の文字列ビュー (class template) [編集] |