web-dev-qa-db-ja.com

コンテナ/アダプタとは何ですか? C ++

コンテナー/アダプターとは何ですか?

誰かが素人の言語で説明してください。

私はインターネットで調べようとしましたが、定義と説明が専門的すぎて理解が困難です。

(クラス/テンプレート/ STL)のようなC++とそのサブトピックの基本的な知識があります。

編集1:

誰かが私にコンテナ/アダプタのアプリケーションの実用的な例を教えてもらえますか?

理解を深めるためだけに:-)

ありがとうございました。

38
Pavitar

<joke>C++は技術的で理解しにくい:-D</joke>

コンテナーは、データを含むことができるSTLのデータ型です。

例:動的配列としてのvector

アダプターは、特定のインターフェイスを提供するためにコンテナーを適応させるSTLのデータ型です。

例:stack選択したコンテナーの上にスタックインターフェイスを提供する

(付記:どちらも実際にはデータ型ではなくテンプレートですが、定義はこの方法でより良く見えます)

62
Let_Me_Be

コンテナーは、通常は無制限の量のデータを含む特定のデータ構造です。コンテナーの種類ごとに、データに効率的にアクセス、追加、または削除する方法に制限があります。

以下は、STLクラスを使用するコンテナの例です。

シーケンスコンテナー

以下はシーケンスコンテナーです。つまり、データは確実に順序付けされます(つまり、それらにはフロントとバックがあります。自動的に並べ替えられるわけではありません!)。

  • あ ベクター 柔軟なサイズの配列に少し似ています。ベクトルはランダムアクセスです。つまり、整数のインデックスを持つ任意の要素に一定の時間でアクセスできます(配列のように)。ベクトルの裏側から、一定の償却期間で追加または削除することもできます。ただし、他の場所では、おそらくすべての要素を再コピーする必要があると考えています。
  • あ デキュー、または両端キューはベクトルのようなものですが、償却後の一定の時間で前または後ろに追加できます。一定時間内に要素にアクセスすることはできますが、deque要素は、ベクトルや配列などのメモリ内で連続しているとは限りません。
  • あ リスト リンクされたリストです。これは、ポインターによって互いにリンクされているデータを意味します。あなたは最初と最後に一定時間アクセスできますが、途中のどこかに行くためにはリストを反復する必要があります。ただし、近くのノードの1つへのポインタがすでにある場合は、リストの任意の場所に一定の時間で要素を追加できます。

連想コンテナ

これらは関連性のあるコンテナです。つまり、要素は順序付けされなくなり、代わりに、一意性またはマッピングを決定するために使用される互いに関連付けられます。

  • あ セットする ユニークな要素を持つコンテナです。セットに追加できるのは各要素の1つだけです。他の追加は無視されます。
  • あ マルチセット はセットのようなものですが、複数の要素を入れることができます。マルチセットは、構造内にある各種類の要素の数を追跡します。
  • あ 地図は、連想配列とも呼ばれ、キーと値のペアを挿入する構造です。次に、キーを指定して任意の値を検索できます。つまり、文字列インデックス(キー)やその他の種類のインデックスでアクセスできる配列に少し似ています。 (別のキーと値のペアを挿入し、そのキーがすでに存在する場合は、元のキーの値を上書きするだけです。)
  • あ マルチマップ 同じキーに複数の値を挿入できるマップです。キールックアップを実行すると、すべての値が含まれるコンテナが返されます。

コンテナアダプター

一方、コンテナアダプタは、既存のコンテナの機能を制限し、異なる機能セットを提供することによって作成されたインターフェースです。コンテナーアダプターを宣言するときに、基になるコンテナーを形成するシーケンスコンテナーを指定するオプションがあります。これらは:

  • あ スタック 後入れ先出し(LIFO)アクセスを提供するコンテナです。基本的に、要素を挿入するときとは逆の順序で要素を削除します。途中の要素に到達するのは困難です。通常、これは デキュー
  • あ キュー 先入れ先出し(FIFO)アクセスを提供するコンテナです。要素は、挿入した順序で削除します。途中の要素に到達するのは困難です。通常、これは デキュー
  • あ priority_queue 要素へのソート順アクセスを提供するコンテナです。要素を任意の順序で挿入し、いつでもこれらの値の「最低」を取得できます。 C++ STLの優先度キューは内部的にヒープ構造を使用しており、ヒープ構造は基本的に配列に基づいています。したがって、通常これは ベクター

各操作の時間の複雑さや各コンテナータイプの詳細ページへのリンクなど、詳細については このリファレンスページ を参照してください。

74
Platinum Azure

SGI STLドキュメント からの「コンテナ」の技術的な定義はかなり良いです:

コンテナは、他のオブジェクト(その要素)を格納するオブジェクトであり、その要素にアクセスするためのメソッドがあります。特に、コンテナのモデルであるすべてのタイプには、コンテナの要素を反復するために使用できるイテレータタイプが関連付けられています。

したがって、コンテナは、あるタイプのオブジェクトのコレクションを保持する(「含む」)データ構造です。重要なアイデアは、さまざまな種類のコンテナがあり、それぞれが異なる方法でオブジェクトを格納し、さまざまなパフォーマンス特性を提供することですが、それらすべてに標準インターフェイスがあり、簡単に、あまり変更せずに1つを別のものと交換できます。コンテナを使用するコードの。考えは、コンテナは可能な限り互換性があるように設計されているということです。

コンテナーアダプターは、コンテナーの機能のサブセットを提供するクラスですが、特定のシナリオでコンテナーを使いやすくする追加機能を提供する場合があります。たとえば、スタックデータ構造にstd::vectorまたはstd::dequeを簡単に使用して、スタックインターフェイスとしてPush_backback、およびpop_backを呼び出すことができます。 std::stackは、std::vectorまたはstd::dequeまたはその他のシーケンスコンテナーを使用できるが、より標準的なPushtop、およびpopメンバーにアクセスするためのメンバー関数。

7
James McNellis