8

STLmapサイズを初期化することは可能ですか?

最後にマップに含まれる要素の数がわかっているので、最初に必要なすべてのメモリを割り当てたいと思います。

4

4 に答える 4

6

いくつかのオプションがあります:

  • ステートフル アロケータで map を使用してみてください。たとえば、Boost.Containerまたは C++11 から。または、非ステートフル アロケータの制限を受け入れる場合は、C++98/03 のマップを使用することもできます。

  • unordered_map の使用を検討してください (Boost または C++11 から) - バケット数をコンストラクターのパラメーターとして使用します。厳密な弱い順序付けではなくハッシュに基づいているという点で、map とは異なります。

  • 別のオプションはBoostの flat_mapです。予約会員機能があります。フラットマップ/セットの説明:

Boost.Container flat_[multi]map/set コンテナは、Austern と Alexandrescu のガイドラインに基づく、順序付きベクトル ベースの連想コンテナです。

  • または、ブーストが利用できない場合は、単に std::vector + std::sort + std::lower_bound を使用できます (またはクラスのような小さな flat_map にラップします)。つまり、要素をベクター (順不同) に配置し、並べ替えてから、要素をキーでクエリする必要がある場合は、lower_bound を使用します。

どちらの選択が優れているかは、使用パターンによって異なります。

于 2012-11-09T00:54:23.960 に答える
4

できません。木です(通常は赤黒木)。実際の値によってメモリ レイアウトが決まります。

ただし、次のことができます。

  • 「フック」で装飾されたBoost Intrusiveマップ (ベクターなど、別のコンテナーに割り当てた要素を使用する) を使用して、その上にマップ機能を実装します。

  • アロケータで std::map を使用すると、固定の「プール」(メモリ領域) からすべての実際の要素を割り当てることができます。

于 2012-11-09T00:51:25.173 に答える
1

私が考えることができる唯一のことは、その反復子コンストラクターを使用することです。唯一のトリックは、必要なサイズの別のコンテナーを作成し、そのイテレーターをコンストラクターに渡す必要があることです。

于 2012-11-09T00:53:18.040 に答える
0

reserveN3376rehashの表 103 のようにエミュレートできます。

a.rehash(n) 
Post: a.bucket_count() > a.size() / a.max_load_factor() 
      and a.bucket_count() >= n.

a.reserve(n) Same as a.rehash(ceil(n / a.max_load_factor()))

ソース

于 2012-11-09T00:53:11.333 に答える