清空后减少std :: unordered_map内存占用

时间:2017-09-16 18:47:00

标签: c++ memory-management unordered-map

假设我有一个std::unordered_map对象,我添加了一些元素,然后删除它们。除了构造一个新对象来替换旧对象之外,有没有办法强制减少地图对象的内存占用量,类似于std::vector::shrink_to_fit()

1 个答案:

答案 0 :(得分:3)

由于节点是根据需要分配和删除的,因此可以减少的唯一内存是存储桶列表使用的内存。这可以通过调用rehash(0)上的unordered_map来完成(参数是要使用的最小桶数;实际数量可以根据地图中存储的内容数量和{{ 1}}地图)。这可能是一项耗时的操作,具体取决于同一个存储桶中有多少节点。

创建新地图的替代方案会更慢,因为存储在新地图中的内容需要为其分配存储空间,在所有插入过程中可能会发生多次重新定位(取决于地图的大小),以及使用的节点旧地图需要被释放。可以通过调用max_load_factor()从旧地图中删除节点来重复使用节点,并extract将节点添加到新地图中,但仍可能在新地图中进行重新搜索。