質問

って読みづSTL容器の私の書C++、具体的には、STL、その器。今では、誰一人ひとりの自分の特定の性質をしっかり覚えて...私のなかに把握するシナリオをそれぞれ使用します。

何の説明?コード例は、はるかに好.

役に立ちましたか?

解決

このチートシートは、さまざまなコンテナのかなり良い概要を提供します。

さまざまな使用シナリオで使用するガイドとして、下部のフローチャートを参照してください。

http://linuxsoftware.co.nz/containerchoice.png

David Moore およびライセンスされたCC BY-SA 3.0

他のヒント

ここに、私が作成したDavid Mooreのバージョン(上記を参照)に触発されたフローチャートを示します。これは、新しい(主に)新しい標準(C ++ 11)で最新のものです。これは私の個人的な見解であり、議論の余地はありませんが、この議論にとって価値があると考えました:

ここに画像の説明を入力

簡単な答え:特に理由がない限り、すべてにstd::vectorを使用します。

考えているケースを見つけたら、<!> quot; Gee、<=>はX <!> quot;のためにここではうまく動作しません。Xに基づいてください。

Scott MeyersによるEffective STLをご覧ください。 STLの使用方法の説明が得意です。

確定/未確定のオブジェクト数を保存したいが、決して削除したくない場合は、ベクターが必要です。これはC配列のデフォルトの置換であり、1つのように機能しますが、オーバーフローしません。 reserve()で事前にサイズを設定することもできます。

不特定数のオブジェクトを保存したいが、それらを追加して削除する場合は、おそらくリストが必要です...ベクターとは異なり、次の要素を移動せずに要素を削除できるためです。ただし、ベクターよりも多くのメモリを必要とし、要素に順番にアクセスすることはできません。

大量の要素を取得して、それらの要素の一意の値のみを検索する場合は、それらをすべてセットに読み込むことでそれが実行され、同様に並べ替えられます。

多くのキーと値のペアがあり、それらをキーでソートする場合、マップは便利ですが...キーごとに1つの値しか保持しません。キーごとに複数の値が必要な場合は、マップで値としてベクトル/リストを使用するか、マルチマップを使用します。

これはSTLにはありませんが、STLのTR1アップデートにあります。キーごとにルックアップするキーと値のペアが多数あり、それらの順序を気にしない場合、ハッシュ(tr1 :: unordered_map)を使用する場合があります。 Visual C ++ 7.1で使用しましたが、stdext :: hash_mapと呼ばれていました。 mapのO(log n)のルックアップの代わりにO(1)のルックアップがあります。

3つのプロパティを持つようにフローチャートを再設計しました:

  1. STLコンテナは2つの主要なクラスに分かれていると思います。基本コンテナとそれらは基本コンテナを活用してポリシーを実装します。
  2. フローチャートでは、最初に決定プロセスを決定すべき主要な状況に分割し、各ケースについて詳しく説明する必要があります。
  3. 一部の拡張コンテナには、内部コンテナとして異なる基本コンテナを選択する可能性があります。フローチャートでは、各基本コンテナを使用できる状況を考慮する必要があります。

フローチャート: ここに画像の説明を入力

詳細は、このリンクで提供されています。

これまで簡潔に述べた重要な点は、連続したメモリが必要な場合(C配列が与えるような)、vectorarray、またはstringしか使用できないことです。

サイズがコンパイル時にわかっている場合は、data()を使用します。

汎用タイプのコンテナだけでなく、文字タイプのみを扱う必要があり、文字列が必要な場合は、<=>を使用します。

他のすべての場合に<=>を使用します(とにかく、ほとんどの場合、コンテナのデフォルトの選択は<=>でなければなりません)。

これら3つすべてで、<=>メンバー関数を使用して、コンテナーの最初の要素へのポインターを取得できます。

すべては、保存したいものと、コンテナで何をしたいかによって異なります。ここに、私が最もよく使用する傾向のあるコンテナクラスの(非常に網羅的ではない)例をいくつか示します。

vector:含まれるオブジェクトごとのメモリオーバーヘッドがほとんどまたはまったくないコンパクトなレイアウト。繰り返し処理するのに効率的です。追加、挿入、および消去は、特に複雑なオブジェクトの場合、高価になる可能性があります。含まれているオブジェクトをインデックスで簡単に見つけることができます。 myVector [10]。 Cで配列を使用する場所を使用します。多くの単純なオブジェクト(intなど)がある場所で使用します。コンテナに多くのオブジェクトを追加する前にreserve()を使用することを忘れないでください。

list:含まれるオブジェクトごとの小さなメモリオーバーヘッド。繰り返し処理するのに効率的です。追加、挿入、消去は安価です。 Cでリンクリストを使用した場所を使用します。

set(およびmultiset):含まれるオブジェクトごとに重要なメモリオーバーヘッド。コンテナに特定のオブジェクトが含まれているかどうかをすばやく見つける必要がある場所を使用するか、コンテナを効率的にマージします。

map(およびmultimap):含まれるオブジェクトごとに重要なメモリオーバーヘッド。キーと値のペアを保存する場所を使用し、キーごとに値をすばやく検索します。

zdanが提案するチートシートのフローチャートは、より包括的なガイド。

マンツーマンレッスンまたは:みでとれたクラスの変更はコンテナタイプ一日では回り大きな驚くことで生きています。

class CollectionOfFoo {
    Collection<Foo*> foos;
    .. delegate methods specifically 
}

なが限られているということ、および保存時にデバッグしたいときに休みまかな操作に関してこの構造をとります。

来の選択に最適なデータ構造のための就職:

各データ構造業では、異なる時間の複雑さ:

O(1),O(lg N),O(N)など。

ご質を最もは、事業を行い、利用データ構造を操作してO(1)です。

簡単ないですよね(-:

ミカエルパーソンの素晴らしいフローチャートを展開しました。いくつかのコンテナカテゴリ、配列コンテナ、およびメモを追加しました。独自のコピーが必要な場合は、こちらがGoogle図面です。基礎を作ってくれてありがとう、ミカエル! C ++コンテナピッカー

この質問の回答としてマークされた別の質問でこれに答えました。しかし、標準コンテナを選択する決定に関して、いくつかの良い記事を参照するのは良いと思います。

@David Thornleyが答えたように、std :: vectorは、他に特別なニーズがない場合の方法です。これは、C ++の作成者であるBjarne Stroustrupによる2014年のブログでのアドバイスです。

こちらは記事のリンクです https://isocpp.org/blog/2014/06/stroustrup-lists

とその引用

  

そして、はい、デフォルトでstd :: vectorを使用することをお勧めします。

コメントでは、ユーザー@NathanOliverは別の優れたブログも提供しています。これには、より具体的な測定値があります。 https://baptiste-wicht.com/ posts / 2012/12 / cpp-benchmark-vector-list-deque.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top