2017-09-16 443 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添加到新地图中,节点可以重复使用,但仍可能在新地图中重新哈希。