コンテナライブラリ
コンテナライブラリは、キュー、リスト、スタックのような一般的なデータ構造をプログラマが簡単に実装できるようなクラステンプレートとアルゴリズムの汎用のコレクションです。 コンテナはシーケンスコンテナ、連想コンテナ、非順序連想コンテナの3種類に分類され、それぞれ違った操作をサポートするよう設計されています。
コンテナは要素のために確保した記憶域空間を管理し、それらに直接またはイテレータ (ポインタに似た性質のオブジェクト) を通してアクセスするためのメンバ関数を提供します。
ほとんどのコンテナは少なくともいくつかのメンバ関数を共通して持っており、機能性を共有しています。 特定のアプリケーションに対してどのコンテナがベストかはその提供される機能性だけではなく、異なるワークロードに対する効率性にもよります。
目次 |
[編集]シーケンスコンテナ
シーケンスコンテナはシーケンシャルアクセスが可能なデータ構造を実装しています。
(C++11) | 要素が隣接した静的な配列 (クラステンプレート) |
要素が隣接した動的な配列 (クラステンプレート) | |
両端キュー (クラステンプレート) | |
(C++11) | 片方向連結リスト (クラステンプレート) |
双方向連結リスト (クラステンプレート) | |
[編集]連想コンテナ
連想コンテナは高速に (O(log n) の計算量で) 検索可能なソート済みのデータ構造を実装しています。
一意なキーによってソートされた、キーのコレクション (クラステンプレート) | |
一意なキーによってソートされた、キーと値のペアのコレクション (クラステンプレート) | |
キーによってソートされた、キーのコレクション (クラステンプレート) | |
キーによってソートされた、キーと値のペアのコレクション (クラステンプレート) | |
[編集]非順序連想コンテナ
非順序連想コンテナは高速に (償却 O(1)、ワーストケースでは O(n) の計算量で) 検索可能なソートされていない (ハッシュされた) データ構造を実装しています。
(C++11) | 一意なキーによってハッシュされた、キーのコレクション (クラステンプレート) |
(C++11) | 一意なキーによってハッシュされた、キーと値のペアのコレクション (クラステンプレート) |
(C++11) | キーによってハッシュされた、キーのコレクション (クラステンプレート) |
(C++11) | キーによってハッシュされた、キーと値のペアのコレクション (クラステンプレート) |
[編集]コンテナアダプタ
コンテナアダプタはシーケンシャルコンテナに対して異なるインタフェースを提供します。
スタック (LIFO データ構造) を提供するためにコンテナを適合させます (クラステンプレート) | |
キュー (FIFO データ構造) を提供するためにコンテナを適合させます (クラステンプレート) | |
優先度付きキューを提供するためにコンテナを適合させます (クラステンプレート) | |
[編集]イテレータの無効化
読み取りのみのメソッドはイテレータや参照を無効化しません。 コンテナの内容を変更するメソッドは、以下の表に示すように、イテレータや参照を無効化する場合があります。
カテゴリ | コンテナ | 挿入後 | 削除後 | 条件 | ||
---|---|---|---|---|---|---|
イテレータは有効か? | 参照は有効か? | イテレータは有効か? | 参照は有効か? | |||
シーケンスコンテナ | array | N/A | N/A | |||
vector | No | N/A | 挿入が容量を変更する場合 | |||
Yes | Yes | 変更した要素の前 | ||||
No | No | 変更した要素およびその後の要素 | ||||
deque | No | Yes | Yes (削除された要素は除く) | 先頭または末尾の要素の変更 | ||
No | No | 途中の要素のみの変更 | ||||
list | Yes | Yes (削除された要素は除く) | ||||
forward_list | Yes | Yes (削除された要素は除く) | ||||
連想コンテナ | set | Yes | Yes (削除された要素は除く) | |||
非順序連想コンテナ | unordered_set | No | Yes | N/A | 挿入により再ハッシュが発生した場合 | |
Yes | Yes (削除された要素は除く) | 再ハッシュが発生しない場合 |
ここで、挿入は、コンテナに1個以上の要素を追加するあらゆるメソッドを指し、削除は、コンテナから1個以上の要素を削除するあらゆるメソッドを指します。
- 挿入メソッドの例としては std::set::insert, std::map::emplace, std::vector::push_back, std::deque::push_front などがあります。
- std::unordered_map::operator[] もマップに要素を挿入する場合があるため挿入メソッドに数えられます。
- 削除メソッドの例としては std::set::erase, std::vector::pop_back, std::deque::pop_front, std::map::clear などがあります。
clear
はすべてのイテレータと参照を無効化します。 すべての要素を削除するので、これも論理的には上記のルールに従います。
終端イテレータに関しては特に述べておく価値があります。 一般的にこのイテレータは、削除されない要素を指す普通のイテレータのように振る舞います。 そのため、 std::set::end は無効化されることは決してなく、 std::unordered_set::end は再ハッシュが発生した場合のみ無効化され、 std::vector::end は常に無効化される (変更された要素より常に後にあるので) といった感じです。
これにはひとつ例外があります。 std::deque の最後の要素の削除は終端イテレータを無効化します。 それがコンテナの削除された要素でなくとも (あるいは要素でさえなくとも) です。 std::deque のイテレータの一般的なルールと組み合わせると、 std::deque::end を無効化しない唯一の変更操作は、最初の要素を削除するもののみという結論になります。
[編集]スレッド安全性
| (C++11およびそれ以降) |
[編集]メンバ関数表
- C++03に存在する関数 | |
- C++11およびそれ以降に存在する関数 | |
- C++17およびそれ以降に存在する関数 |