C++には値の集まりを処理するためのクラス、つまりコンテナがたくさんあります。
まずは、vector, listくらいを使えるようになっておくとよいです。他は存在を知っておく程度にして使うときに調べるくらいでいいと思います。
C++のコンテナ
プログラミングでは値の集まりを処理するということをよくやります。
C++で値の集まりのことをコンテナと呼びます。いろいろな手段を提供することを信条とするC++は様々なコンテナを持ちます。
まずは、vectorが使えるようになればよいと思いますが、その他も存在くらい知っておきましょう。
コンテナの4つの種類
コンテナには4つに分類されます。
- シーケンスコンテナ(sequence container)
- 連想コンテナ(associative container)
- コンテナアダプタ(container adapter)
- ほとんどコンテナ(almost container)
「コンテナアダプタ」と「ほとんどコンテナ」は無視でいいと思います。なので、「シーケンスコンテナ」と「連想コンテナ」を詳しく説明します。
詳しくはストラウストラップが書いたC++の聖書を参照してください。
シーケンスコンテナ
いわゆるコンテナと聞いて思いつくものは大体シーケンスコンテナです。
以下の4つがあります
- vector
- list
- forward_list
- deque
vector
vectorは最も使うコンテナです。ほとんどの場面は、これだけでいけると思います。
C言語の配列を模したもので性能もよいです。
ランダムな場所に値を挿入するならvectorではなくlistで。その他はvectorで。
list, forward_list, deque
vectorがほぼ配列なのに対して、listは各要素のつながりをポインタで管理します。メモリ消費は大きいですが、ランダムな位置への挿入をやるならlistを使いましょう。また、キュー構造を実装するならlistです。
forward_listは次の要素のみへのポインタを持っていて、前の要素にアクセスするのは面倒です。多くの空リストや小さいリストを使うときはforward_listを使ってください。
dequeは両端キュー(double ended queue)です。あらゆるランダムなアクセスに対応できます。連結リストの中では最強ですが、あまり使う機会がありません。
連想コンテナ
連想コンテナは、順序つき(orderd)と非順序(unordered)に分かれます。
それぞれ以下のようになっています。
- map
- multimap
- set
- multiset
- unorderd_map
- unorderd_multimap
- unorderd_set
- unorderd_multiset
順序付きと非順序の違い
順序つきと非順序の違いは、実装に木構造を用いているかハッシュテーブルを用いているかの違いがあります。
辞書みたいな使い方をするなら順序付き、ランダムなら非順序かと思います。(私は使い分けたことがありません)
mapとsetの違い
mapは{key, value}の組が並んでいるものです。対してsetはkeyだけが並んでいるものです。
plainとmultiの違い
mapとmultimapの違いですが、keyが一意なのがplainのmap、1つのkeyに複数のvalueを許すのがmultimapです。
まとめ
C++のコンテナについて説明しました。
大抵はvector、ランダムな挿入をするときはlist。その他は存在を知っておく程度で。
詳しくはストラウストラップの本に全部書いてあります。
コメント