vectorとmap、どちらを使うか?
質問
コンテナ内の想定要素数が比較的少ない場合は
std::vector
の代わりに
std::map
の代わりに
この背後にある本当の理由は何でしょうか?
明らかに、ルックアップのパフォーマンスは
std::map
よりも悪くなることはありえません。
std::vector
(ナノ秒/マイクロ秒の差はあるかもしれませんが)なので、メモリ使用量と関係があるのでしょうか?
は
std::vector
よりも良いのか悪いのか
std::map
と比べて良いのか悪いのか?
Visual Studioに付属しているSTLライブラリ(つまりMicrosoftの実装)を使用しています。 これは、他の実装と比較して何か違いがあるのでしょうか?
どのように解決するのですか?
あなたが比較しているのは
map<A, B>
と
vector<pair<A, B> >
.
まず、非常に小さなベクトルで項目を見つけることは、マップの同じものよりも簡単に速くなります。ベクトル内のすべてのメモリは常に連続しており(そのため、コンピュータのキャッシュなどとうまく連携しています)、ベクトルで何かを見つけるために必要な比較の数はマップの場合とほぼ同じかもしれないためです。マップ内の要素を見つけるには、非常に大きなコンテナの制限内でより少ない操作が必要です。
マップがベクトルより速くなるポイントは、実装、プロセッサ、マップ内のデータ、プロセッサのキャッシュにあるメモリなどの微妙なものに依存します。一般的に、マップが高速になるポイントは、5~30要素程度でしょう。
別の方法として、ハッシュコンテナを使用することもできます。これらはしばしば
hash_map
または
unordered_map
. という名前のクラスは
hash_map
という名前のクラスは公式な標準の一部ではありません (そして、そこにはいくつかの亜種があります)。
std::tr1::unordered_map
です。ハッシュマップは要素の数に関係なく、ルックアップのために通常のマップよりも速いことがよくありますが、実際に速いかどうかは、キーが何か、どのようにハッシュ化されるか、どんな値を扱う必要があるか、そして std::map でキーがどのように比較されるかに依存します。std::mapのように特定の順序で保持することはできませんが、あなたはそのことを気にしないと言っています。キーが整数やポインタの場合は特にハッシュマップをお勧めします。
関連
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] std::vectorをハードコードされた要素で初期化する最も簡単な方法は何ですか?
-
[解決済み] std::vector<> からインデックスで要素を消すにはどうしたらいいですか?
-
[解決済み] C++ std::map に指定されたキーが存在するかどうかを調べる方法
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
最新
-
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のメンバではない
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる