使用unordered_map

时间:2016-09-24 09:40:10

标签: c++ c++11 memory-management unordered-map c++-standard-library

如果std::unordered_map<int,...>保持大致相同的大小但不断添加和删除项目,它是否会不断分配和释放内存或缓存并重用内存(即像池或向量)?假设库的现代标准MS实现。

1 个答案:

答案 0 :(得分:0)

标准并未具体涉及这些方面,因此它们是实现定义的。最值得注意的是,您描述的缓存行为通常是通过使用自定义分配器(例如,对于memory pool allocator)实现的,因此通常应该与容器实现分离。

关于无序容器的the standard, ~p874的相关位:

  

无序关联容器的元素被组织成   桶。具有相同哈希码的密钥出现在同一个存储桶中。该   添加元素时,桶的数量会自动增加   一个无序的关联容器,这样的平均数   每桶的元素保持在一个界限之下。

并插入:

  

插入和安置成员不得影响其有效性   迭代器if(N + n)&lt; = z * B,其中N是元素的数量   在插入操作之前的容器中,n是元素的数量   插入,B是容器的桶数,z是容器的   最大载荷系数

您可以在行之间读取并假设由于迭代器有效性不受影响,因此可能不会进行内存分配。虽然这绝不是保证(例如,如果存储区数据结构是链表,您可以附加到它而不会使迭代器失效)。标准似乎没有指定删除元素时应该发生什么,但由于它无法使上述约束无效,因此我没有看到解除内存释放的原因。

确定具体实施的最简单方法是阅读源代码或配置代码。 或者,您可以尝试使用rehashresize方法并调整地图的load_factor来控制此行为(如果确实需要)。