2016-08-19 15 views
2
unordered_map

には存在していない場合にはゼロを返す:キーは、私は次のコンテナ持っ

std::unordered_map<uint8_t,int> um; 

umが0と255すべてではなく、それらの間の鍵を持っていると想定されています。だから、特定の時点で私は例えばキー13の値を私に与えてくれるようにしたいと思っています。それがあれば、私はその価値を望んでいます(0でないことが保証されています)。そうでない場合は、0を返すようにします。

これを実装する最も良い方法は何ですか?

今まで私が試したことは:findを使用して、見つからなかった場合は0を、見つからなかった場合は値を返します。

P.S. 256個のアイテムを含むstd::vector<int>に変更することは選択できません。私は256の値を常に格納する余裕がありません。


EDIT:

私の問題は、ヒストグラム・コンピューティングの問題キー(色0〜255)の値(頻繁に、intは十分である)です。私はちょうどいくつかのキーが存在するかどうかを知っていれば満足できません。私はまた、値(頻繁)が必要です。

追加情報:

  • 私は、任意の項目を消去することはありません。
  • 時々アイテムを追加します(最大256アイテム)。通常は10未満です。
  • 私は何度もキーを照会します。
  • 通常、クエリと挿入には特定の順序はありません。
+8

よく「find」は一定時間ですので、何かが速く見つかるとは限りません。 – NathanOliver

+1

また、 'ベクトル'を使うこともできます。それは256バイトといくつかの本を保持するだけです。 – NathanOliver

+0

@ NathanOliverブールのベクトルが私に役立たず、値(int)は0または1だけではない実数を含む可能性があります。 –

答えて

4

メモリとスピードの間にトレードオフがあります。

あなたのunordered_mapのスピードはそれほど複雑ではありません。

を使用すると、std::vector<std::pair<uint8_t, int>>を使用すると、よりコンパクトになり(キャッシュがより使いやすくなります)。

std::pair<std::vector<uint8_t>, std::vector<int>>は(uint8_tintの間には、パディング)あなたも、サイズ/容量を因数分解することによって、より良い行うことができます

さらにコンパクトないだろうが、それはもはやstd::です。 vector

、あなたはその後、他の取引があります。検索のための複雑さを、キー追加:

  • ソートされていないベクトル:一定の追加、リニア検索
  • ソートベクトル:リニアアドオン(に値を挿入することにより、ベクトルの真中)、対数探索。
0

私は空間のコンパクトさのためにベクトルを使用するかもしれません。

対数検索のパフォーマンスを考慮して並べ替えておくのは魅力的です。しかし、期待される要素の数が10より少ないので、私はそれを並べ替えずにリニア検索を使用することができます。

ので

vector<pair<uint8_t, int>> data; 

期待の要素の数はその後、ソートされたベクトルは役立つかもしれない持つ、大きい場合。

ブーストには、ベクターのようなレイアウトの地図のようなインターフェイスがあります。 boost flat_map at http://www.boost.org/doc/libs/1_48_0/doc/html/container/non_standard_containers.html#container.non_standard_containers.flat_xxx

関連する問題