[解決済み] C++11で標準ライブラリコンテナを効率的に選択するにはどうすればよいですか?
質問
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から人物データを取得したいとします。
-
を用意したい。
find
関数、つまり連想コンテナ
1.1. 順番なんてどうでもいい、だから
unordered_
コンテナ
1.2. 私のキー(ID)は、それが関連する値とは別のもので、したがって
map
1.3. IDは一意であり、したがって、重複が忍び込むことはありません。
最終的な回答は
std::unordered_map<ID, PersonData>
.
質問2. メモリの安定性 ?
-
要素がメモリ上で安定していなければならない場合 (つまり、コンテナ自体が変更されたときに移動してはならない場合)、いくつかの
list
- そうでない場合は、質問 3 にジャンプします。
質問2.1: どの ?
-
で決済する
list
; aforward_list
はメモリフットプリントを少なくするためにのみ有効です。
質問3. 動的なサイズ調整 ?
-
コンテナのサイズが既知である場合(コンパイル時)。
と
は、このサイズがプログラムの途中で変更されることはありません。
と
はデフォルトで構成可能な要素です。
または
を指定すると、完全な初期化リストを提供することができます (
{ ... }
構文を使って)、次にarray
. これは従来のC-arrayを置き換えるものですが、便利な機能がついています。 - そうでなければ、質問4へジャンプします。
質問4. ダブルエンド ?
-
前と後ろの両方から項目を削除できるようにしたい場合は
deque
を、そうでない場合はvector
.
デフォルトでは、連想コンテナが必要でない限り、選択されるのは
vector
. また、それは
Sutter と Stroustrup の推奨する
.
関連
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] std::stringをintに変換するにはどうしたらいいですか?
-
[解決済み] STL」と「C++ Standard Library」の違いは?
-
[解決済み] リファレンスとポインタの使い分け
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】CとC++におけるユニオンの目的
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】coutはstdのメンバではない
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】C++の余分な資格エラー
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】特定のSTLコンテナをどのようなシナリオで使用するか?
-
[解決済み] どのJavaコレクションを使うべきですか?