7

固定サイズを定義することは可能unordered_mapですか?

メンバー関数を見ると、とに似たものはありませresize()ん。また、グーグルは私を助けませんでした。std::vectorstd::list

4

3 に答える 3

9

はい、可能ですが、STLにはそのようなマップはありません。あなたができることは、を含む独自のクラスを作成し、自分自身を使用しstd::array< std::pair<Key, Value>, N>てほとんどの機能を提供するfind()ことinsert()ですstd::hashstd::vector< std::pair<Key, Value> >データメンバーとしてを使用する場合はresize()、テーブルを明示的に展開するだけで、。の後に暗黙的に展開しない関数を使用することもできますinsert()

理解しておくべき重要なことは、すべてのコンテナ要件を満たすために、さまざまな要素を反復処理する方法も提供する必要があるということです。通常、これは、格納されているすべての要素にリンクリストを実装する補助データを使用することによって行われます。

ただし、解決する必要のある問題の1つは、配列がいっぱいの場合にアイテムを置き換えるために使用する置換ポリシーです。std::unorderd_mapいわゆるチェーンを使用し、エントリごとに動的にサイズ設定されたバケットを使用します(少なくとも順方向の反復があるため、少なくともと同等ですforward_list)。ほとんどのチェスプログラムには、特定のテーブルエントリがすでに占有されている場合に常にアイテムを置き換えるための、置換ポリシーを備えた固定サイズのハッシュテーブルがあります。

于 2013-01-19T19:19:28.273 に答える
0

resize()他のシーケンスコンテナのように、マップがメンバー関数を持つことは論理的に不可能です。これはマップであり、そのすべてのキーは一意である必要があります。サイズを変更する場合は、新しく作成されたエントリにいくつかの(デフォルトの)値を入力する必要があります。キーに対してどのような値を生成する必要がありますか?キーの一意性をどのように保証しますか?その決定はマップではできないので、単純にresize()メンバー関数を持っていません。

于 2013-01-19T19:21:01.217 に答える
0

マップのサイズを既知のサイズに変更して、さらに非効率的な再ハッシュを回避することが目標である場合は、を使用できますstd::unordered_map:: reserve。バケットの数が設定されるため、マップには負荷率に応じて指定された数の要素を含めることができます。

于 2013-01-19T19:29:18.180 に答える