2017-09-16 11 views
2

いくつかの要素を追加して削除するstd::unordered_mapオブジェクトがあるとします。古いオブジェクトを置き換える新しいオブジェクトを作成する以外に、std::vector::shrink_to_fit()に似た、マップオブジェクトのメモリフットプリントを強制的に減らす方法はありますか?std :: unordered_mapメモリフットプリントを空にした後に減らす

+2

これのためのアロケータを書くことが過度であるかどうかわかりません。 – Rakete1111

+1

ハッシュマップを縮小するには再ハッシュが必要なため、新しいハッシュマップを作成することはおそらく同じ速さです。 – rustyx

答えて

1

ノードは必要に応じて割り当てられ、削除されるため、削減できるメモリはバケットリストで使用されるメモリだけです。これは、unordered_mapresize(0)(パラメータは使用するバケツの最小数であり、マップに格納されているものの数とマップのmax_load_factor()に基づいて実際の数は大きくなる可能性があります)を呼び出します。これは、同じバケツで終わるノードの数に応じて、時間がかかる操作である可能性があります。

新しいマップを作成する代わりに、新しいマップに格納されたものに割り当てられた記憶領域が必要になるため、すべての挿入中に再ハッシュが発生する可能性があります(マップのサイズによって異なる)古い地図で使われていたものは解放する必要があります。ノードは、extractを呼び出して古いマップからノードを削除し、insertを新しいマップに追加することによって再利用できますが、新しいマップで再ハッシュが発生する可能性があります。

関連する問題