为什么C ++ 11 / Boost`unordered_map`在擦除时不会重新散列?

时间:2015-08-09 19:03:39

标签: c++ c++11 boost unordered-map

我想知道为什么C ++ 11和Boost的hashmap在通过迭代擦除元素时不会调整大小。即使这在技术上不是内存泄漏,我认为它可能是应用程序中的一个严重问题(对我来说这是一个隐藏的问题,很难追溯它)并且它实际上可能影响许多应用程序。这是容器的“设计缺陷”吗?

我对它进行了基准测试,似乎影响了几个编译器版本(包括VS,Clang,GCC)

重现问题的代码是:

std::unordered_map<T1,T2> m;

for (int i = 0; i < 5000000; i++)
        m.insert(std::make_pair(i, new data_type));


for (map_type::iterator it = m.begin(); it != m.end();) {
        delete it->second;
        it = m.erase(it);
}   

我创建了一个self-contained test文件,该文件使用自定义分配器来跟踪内存使用情况。

只要我理解,其背后的原因是允许通过迭代擦除元素并保持有效的迭代器不被擦除的元素。这似乎有点奇怪的要求,因为插入元素可能会导致重新哈希无论如何使迭代器无效。 / p>

  

但你可以直接破坏地图..

我是如何解决这个问题的(我将地图包裹在一个智能指针内,当它是空的时我只是重新创建一个新的空地图,结果比重新加速更快,不知道为什么。)。

通常,任何使用unordered_map作为缓存元素容器的应用程序都可能会遇到此问题(您可能希望从缓存中删除元素,但通常没有人执行“缓存重置”)

0 个答案:

没有答案