STL コンテナー

ISO 標準テンプレート ライブラリ (STL) には、関連するオブジェクトのコレクションを格納するコンテナーが用意されています。 コンテナーは、コンテナーで許可されるオブジェクトを指定できるようにするテンプレート クラスです。

注意

この記事は、STL/CLR には適用されません。詳細については、「STL/CLR ライブラリ リファレンス」を参照してください。

STL のコンテナーは、シーケンス コンテナー、連想コンテナー、およびコンテナー アダプターの 3 種類に分けることができます。

シーケンス コンテナー

シーケンス コンテナーは、挿入された要素の、指定された順序を維持します。

vector コンテナーは配列のように動作しますが、必要に応じて自動的に拡張されます。 ランダム アクセスが可能で連続して格納され、長さに関しては高い柔軟性があります。 こうした理由などから、vector はほとんどのアプリケーションに推奨されるシーケンス コンテナーです。 詳細については、「vector クラス」を参照してください。

array コンテナーは vector の長所の一部を備えていますが、長さに関する柔軟性は高くありません。 詳細については、「array クラス (STL)」を参照してください。

deque (両端キュー) コンテナーは、コンテナーの先頭と末尾で、すばやい挿入および削除を行うことができます。 vector のランダム アクセスと長さの柔軟性という利点を備えていますが、連続的ではありません。 詳細については、「deque クラス」を参照してください。

list コンテナーはダブルリンク リストであり、双方向アクセスや、コンテナー内の任意の場所での高速な挿入および削除が可能ですが、コンテナー内の要素にランダムにアクセスすることはできません。 詳細については、「list クラス」を参照してください。

forward_list コンテナーはシングルリンク リストであり、list の前方アクセス バージョンです。 詳細については、「forward_list クラス」を参照してください。

連想コンテナー

連想コンテナーでは、要素は事前に定義された順序で挿入されます (たとえば、昇順に並べ替えられて)。 順序なしの連想コンテナーも使用できます。 連想コンテナーは、マップとセットという 2 つのサブセットに分類できます。

ディクショナリとも呼ばれる map は、キーと値のペアで構成されています。 キーはシーケンスを順序付けるために使用され、値はそのキーに関連付けられます。 たとえば、map には、テキスト内のすべての一意の単語を表すキーと、それに対応する、テキスト内で各単語が出現する回数を表す値が含まれる場合があります。 map の順序なしのバージョンは unordered_map です。 詳細については、「map クラス」および「unordered_map クラス」を参照してください。

set は単に、一意の要素の昇順のコンテナーです。値がキーにもなっています。 set の順序なしのバージョンは unordered_set です。 詳細については、「set クラス」および「unordered_set クラス」を参照してください。

mapset のどちらでも、キーまたは要素の 1 つのインスタンスだけをコンテナーに挿入できます。 要素の複数のインスタンスが必要な場合は、multimap または multiset を使用します。 順序なしのバージョンは unordered_multimapunordered_multiset です。 詳細については、「multimap クラス」、「unordered_multimap クラス」、「multiset クラス」、および「unordered_multiset クラス」を参照してください。

順序ありのマップおよびセットは双方向反復子をサポートしており、順序なしのバージョンは前方反復子をサポートしています。 詳細については、「反復子」を参照してください。

コンテナー アダプター

コンテナー アダプターは、簡潔さと明確さのためにインターフェイスを制限する、シーケンスまたは連想コンテナーの変化形です。 コンテナー アダプターは反復子をサポートしていません。

queue コンテナーは FIFO (先入れ先出し) のセマンティクスに従います。 プッシュされた (つまり、キューに挿入された) 最初の要素は、最初にポップされます (つまり、キューから削除されます)。 詳細については、「queue クラス」を参照してください。

priority_queue コンテナーは、最高の値を持つ要素が常にキューの先頭になるように編成されます。 詳細については、「priority_queue クラス」を参照してください。

stack コンテナーは、LIFO (後入れ先出し) のセマンティクスに従います。 スタックに最後にプッシュされた要素が最初にポップされます。 詳細については、「stack クラス」を参照してください。

コンテナー アダプターは反復子をサポートしていないため、STL アルゴリズムでは使用できません。 詳細については、「アルゴリズム」を参照してください。

コンテナー要素の要件

一般に、STL コンテナーに挿入される要素は、コピー可能なものであれば、ほぼどのオブジェクト型でもかまいません。 移動のみ可能な要素 (たとえば、unique_ptr<> を使用して作成される vector<unique_ptr<T>> など) は、要素をコピーしようとするメンバー関数を呼び出さなければ正常に動作します。

デストラクターは例外のスローを許可されていません。

この記事の前の方で説明した順序ありの連想コンテナーでは、パブリックな比較演算子が定義されている必要があります。既定では、演算子は operator< ですが、operator< とでは動作しない型もサポートされます。

コンテナーに対する一部の操作では、パブリックな既定のコンストラクターとパブリックな等価演算子も必要となる場合があります。 たとえば、順序なしの連想コンテナーでは、等値とハッシュのサポートが必要です。

コンテナー要素へのアクセス

コンテナーの要素には、反復子を使用してアクセスします。 詳細については、「反復子」を参照してください。

注意

また、STL コレクションに対する反復処理には範囲ベースの for ループを使用できます。

参照

関連項目

標準テンプレート ライブラリ

<sample container>

C++ 標準ライブラリ内のスレッド セーフ

概念

コンテナー (Modern C++)