「コンテナ」の版間の差分
提供: C++入門
行22: | 行22: | ||
* [[std::fill]]で各要素に同じ値を代入する。 | * [[std::fill]]で各要素に同じ値を代入する。 | ||
* [[for]]文で[[std::vector::push_back]]で1つ1つプッシュする。 | * [[for]]文で[[std::vector::push_back]]で1つ1つプッシュする。 | ||
− | + | == STLコンテナの使い分け == | |
+ | === 連想配列を使いたい === | ||
+ | * [[std::tr1::unordered_map]]を使用します。 | ||
+ | === 要素数が固定の場合 === | ||
+ | * ビット値の場合は bitset を利用します。 | ||
+ | * ビット値以外の場合は、[[std::array]] を使用します。 | ||
+ | === 要素数が固定ではなく、連想配列ではない === | ||
+ | * 要素数が少ない場合は、[[std::vector]]を利用します。 | ||
+ | * メモリ効率を優先する場合 | ||
+ | ** 先頭や末尾の挿入や削除の頻度が高い場合は、[[std::deque]]を使用します。 | ||
+ | ** それ以外は、[[std::vector]]を利用します。 | ||
+ | * 速度重視で、ランダムアクセスの頻度が高い場合 | ||
+ | ** 先頭や末尾の挿入や削除の頻度が高い場合は、[[std::deque]]を使用します。 | ||
+ | ** それ以外は、[[std::vector]]を利用します。 | ||
+ | ** ランダムアクセスの速度を妥協できて、要素の挿入・削除の速度を上げる場合 | ||
+ | *** キーを大きさの順番で保持する必要がなければ、[[std::unordered_map]]を使用します。 | ||
+ | *** 順序の保持が必要であれば、[[std::map]] を利用します。 | ||
+ | * 速度を重視し、挿入・削除の頻度が高い場合 | ||
+ | ** 先頭・末尾の挿入・削除の頻度が高い場合は、[[std::deque]] を使用します。 | ||
+ | ** 途中の要素の挿入・削除の頻度が高い場合は、[[std::forward_list]] | ||
+ | ** それ以外は、[[std::list]] を利用します。 | ||
+ | * 速度を重視し、検索頻度が高い場合 | ||
+ | ** [[std::unordered_set]], [[std::unordered_multiset]] | ||
+ | ** それ以外は、[[std::set]], [[set::multiset]] を使用します。 | ||
== 関連項目 == | == 関連項目 == | ||
{{container}} | {{container}} | ||
− | <!-- vim: filetype=mediawiki --> | + | <!-- vim: filetype=mediawiki |
+ | --> |
2015年11月8日 (日) 14:46時点における版
コンテナ (container)とは、オブジェクトの集まりを表現するデータ構造、クラスです。C++のSTLで用意されているコンテナには、いろいろな種類があり、それぞれ目的ごとに使い分けます。
読み方
- コンテナ
- こんてな
- container
- こんてな
概要
コンテナには、以下ような種類があります。
- 配列
- リスト
- スタック
- キュー
- ハッシュ
- 連想配列
コンテナの初期化
- std::initializer_listで宣言時の初期化リストで初期化する。
- std::iotaで各要素に連番の値を代入する。
- std::generateで各要素に値を代入する。
- std::for_eachで各要素に値を代入する。
- std::fillで各要素に同じ値を代入する。
- for文でstd::vector::push_backで1つ1つプッシュする。
STLコンテナの使い分け
連想配列を使いたい
- std::tr1::unordered_mapを使用します。
要素数が固定の場合
- ビット値の場合は bitset を利用します。
- ビット値以外の場合は、std::array を使用します。
要素数が固定ではなく、連想配列ではない
- 要素数が少ない場合は、std::vectorを利用します。
- メモリ効率を優先する場合
- 先頭や末尾の挿入や削除の頻度が高い場合は、std::dequeを使用します。
- それ以外は、std::vectorを利用します。
- 速度重視で、ランダムアクセスの頻度が高い場合
- 先頭や末尾の挿入や削除の頻度が高い場合は、std::dequeを使用します。
- それ以外は、std::vectorを利用します。
- ランダムアクセスの速度を妥協できて、要素の挿入・削除の速度を上げる場合
- キーを大きさの順番で保持する必要がなければ、std::unordered_mapを使用します。
- 順序の保持が必要であれば、std::map を利用します。
- 速度を重視し、挿入・削除の頻度が高い場合
- 先頭・末尾の挿入・削除の頻度が高い場合は、std::deque を使用します。
- 途中の要素の挿入・削除の頻度が高い場合は、std::forward_list
- それ以外は、std::list を利用します。
- 速度を重視し、検索頻度が高い場合
- std::unordered_set, std::unordered_multiset
- それ以外は、std::set, set::multiset を使用します。
関連項目
シーケンスコンテナ
連想コンテナ
連行コンテナ 順不同
コンテナアダプタ
コンテナへのアクセスで利用
コンテナで役立つC++11以降の機能
- std::iotaで各要素に連番の値を代入する。
- std::generateで各要素に値を代入する。
- std::for_eachで各要素に値を代入する。
- std::fillで各要素に同じ値を代入する。
- for文でstd::vector::push_backで1つ1つプッシュする。