2017-09-16 122 views
2

假設我有一個std::unordered_map對象,我添加了一些元素然後刪除它們。除了構建一個替換舊對象的新對象之外,是否有辦法強制減少映射對象的內存佔用,類似於std::vector::shrink_to_fit()清空後減少std :: unordered_map內存佔用空間

+2

我不知道是否爲此編寫分配器是否過分。 – Rakete1111

+1

縮小哈希映射涉及重新哈希,因此構建新的哈希映射可能同樣快。 – rustyx

回答

1

由於根據需要分配和刪除節點,所以可以減少的唯一內存是存儲區列表所使用的內容。這可以通過unordered_map上的resize(0)來完成(該參數是要使用的桶的最小數量;實際數量可以基於存儲在地圖中的東西的數量和地圖的max_load_factor()更大)。這可能是一個耗時的操作,具體取決於同一個存儲桶中有多少個節點。

創建新地圖的替代方法將會變慢,因爲存儲在新地圖中的東西將需要爲它們分配存儲空間,在所有插入過程中都可能發生幾次重新刷新(取決於地圖的大小),以及節點舊地圖使用將需要被釋放。通過調用extract從舊地圖中刪除節點,然後將insert添加到新地圖中,節點可以重複使用,但仍可能在新地圖中重新哈希。