1. ホーム
  2. c++

[解決済み] C++11で標準ライブラリコンテナを効率的に選択するにはどうすればよいですか?

2022-06-03 08:59:09

質問

C++コンテナ選択」という有名な画像(チートシート)があります。これは、使用したい用途に最適なコンテナを選択するためのフローチャートです。

これのC++11バージョンが既にあるかどうか、誰か知っていますか?

これは以前のものです。

どのように解決するのですか?

私が知っている限りではありませんが、テキストで行うことは可能だと思います。また、グラフが少しずれているのは list は一般にそれほど良いコンテナではありませんし、また forward_list . どちらのリストも、ニッチなアプリケーションのための非常に特化したコンテナです。

このようなチャートを構築するためには、2つのシンプルなガイドラインが必要なだけです。

  • 最初にセマンティクスを選択する
  • いくつかの選択肢がある場合、最もシンプルなものを選ぶ

パフォーマンスについて心配しても、最初のうちはたいてい無駄です。数千(またはそれ以上)のアイテムを扱い始めて初めて、大きな「O」の考慮事項が本当に効力を発揮します。

コンテナには2つの大きなカテゴリがあります。

  • アソシアティブ コンテナ:これらのコンテナには find 操作
  • 単純な配列 コンテナ

で、その上にいくつかのアダプタを構築することができます。 stack , queue , priority_queue . アダプターはここでは省きますが、十分に専門的であり、認識できるものです。


質問 1: 連想 ?

  • で簡単に検索する必要がある場合 1 キーで検索する必要があるなら、連想コンテナ
  • 要素の並べ替えが必要な場合は、順序付き連想配列コンテナが必要です。
  • そうでない場合は、質問2にジャンプします。

質問1.1: オーダー ?

  • 特定の順序が必要でない場合は unordered_ コンテナを使用し、そうでない場合は従来の順序付き対応物を使用します。

質問1.2: キーを分離する ?

  • キーと値が別々になっている場合は map を、それ以外の場合は set

質問1.3: 重複 ?

  • 重複しているものを残したい場合は multi を使用し、そうでなければ使用しない。

一意なIDを持つ人物が何人かいて、できるだけ簡単にそのIDから人物データを取得したいとします。

  1. を用意したい。 find 関数、つまり連想コンテナ

1.1. 順番なんてどうでもいい、だから unordered_ コンテナ

1.2. 私のキー(ID)は、それが関連する値とは別のもので、したがって map

1.3. IDは一意であり、したがって、重複が忍び込むことはありません。

最終的な回答は std::unordered_map<ID, PersonData> .


質問2. メモリの安定性 ?

  • 要素がメモリ上で安定していなければならない場合 (つまり、コンテナ自体が変更されたときに移動してはならない場合)、いくつかの list
  • そうでない場合は、質問 3 にジャンプします。

質問2.1: どの ?

  • で決済する list ; a forward_list はメモリフットプリントを少なくするためにのみ有効です。

質問3. 動的なサイズ調整 ?

  • コンテナのサイズが既知である場合(コンパイル時)。 は、このサイズがプログラムの途中で変更されることはありません。 はデフォルトで構成可能な要素です。 または を指定すると、完全な初期化リストを提供することができます ( { ... } 構文を使って)、次に array . これは従来のC-arrayを置き換えるものですが、便利な機能がついています。
  • そうでなければ、質問4へジャンプします。

質問4. ダブルエンド ?

  • 前と後ろの両方から項目を削除できるようにしたい場合は deque を、そうでない場合は vector .

デフォルトでは、連想コンテナが必要でない限り、選択されるのは vector . また、それは Sutter と Stroustrup の推奨する .