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

标签 c++ memory-management unordered-map

假设我有一个 std::unordered_map 对象,我向其中添加了一些元素,然后删除了它们。除了构造一个新对象来替换旧对象之外,是否有一种方法可以强制减少 map 对象的内存占用,类似于 std::vector::shrink_to_fit()

最佳答案

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

创建新 map 的替代方案会更慢,因为存储在新 map 中的东西需要为它们分配存储空间,在所有插入过程中可能会发生几次重新散列(取决于 map 的大小),以及使用的节点通过旧 map 将需要被释放。可以通过调用 extract 从旧映射中删除节点,调用 insert 将它们添加到新映射来重用节点,但在新映射中仍然可能发生重新散列。

关于c++ - 清空后减少 std::unordered_map 内存占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46257326/

相关文章:

c++ - 为什么 map 会比 unordered_map 快得多?

c++ - 什么是 C++ 中的可追踪指针?

c++ - 有必要删除动态结构内容,然后删除结构本身吗?

c++ - Qt - std::unordered_map - 销毁时间

algorithm - Web 服务器上分配的内存增长

c - 通过 void 指针访问各种类型的内存

c++ - unordered_map 中带有模板类的 C2535(Microsoft Visual Studio 2015 CTP6)

c++ - 将指向成员函数的指针转换为 intptr_t

c++ - 在任意加长的集合中查找最大数量是行不通的

c++ - 纹理不渲染