Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 清空std::无序映射内存后减少内存占用_C++_Memory Management_Unordered Map - Fatal编程技术网

C++ 清空std::无序映射内存后减少内存占用

C++ 清空std::无序映射内存后减少内存占用,c++,memory-management,unordered-map,C++,Memory Management,Unordered Map,假设我有一个std::unordered_map对象,我在其中添加了一些元素,然后将它们删除。除了构造一个新对象来替换旧对象之外,是否有一种方法可以强制减少映射对象的内存占用,类似于std::vector::shrink_to_fit()?由于节点是根据需要分配和删除的,因此可以减少的唯一内存是存储桶列表所使用的内存。这可以通过调用unordered_map上的rehash(0)(该参数是要使用的最小存储桶数;根据存储在映射中的内容数量和映射的max_load_factor())来实现。这可能是

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

由于节点是根据需要分配和删除的,因此可以减少的唯一内存是存储桶列表所使用的内存。这可以通过调用
unordered_map
上的
rehash(0)
(该参数是要使用的最小存储桶数;根据存储在映射中的内容数量和映射的
max_load_factor()
)来实现。这可能是一个耗时的操作,具体取决于同一个bucket中有多少节点


创建新映射的备选方案将更慢,因为存储在新映射中的内容需要为其分配存储空间,在所有插入过程中可能会发生多次重新存储(取决于映射的大小),并且旧映射使用的节点将需要释放。通过调用
extract
从旧映射中删除节点,然后调用
insert
将节点添加到新映射中,可以重用节点,但是在新映射中仍然可以进行重新分级。

我不知道为此编写分配器是否过份。缩小哈希映射需要重新分级,因此构建新哈希映射可能同样快。