Jak*_* S. 12 c++ unordered-map visual-studio-2010
我想在VS2010 C++下的索引double处存储~3,000,000个值unsigned int.我用它std::tr1:unordered_map<unsigned int, double>来达到这个目的.不幸的是,当我尝试存储值2 ^ 21时,会抛出异常(就好像只有2 ^ 21-1的空间,即某些索引只能使用20位).我rehash在存储值之前尝试过,这也没有用.
最后,我最终得到了一些非常基本的测试程序(它表现出甚至有点不同的行为,但无论如何):
std::tr1::unordered_map<unsigned int, float> mapOut;
//mapOut.rehash(SOMESIZE);
for (unsigned int i=0; i<3000000; i++)
{
if (i%1000==0) std::cout << i << std::endl;
mapOut[i] = 0.0;
}
Run Code Online (Sandbox Code Playgroud)
我查了一些案例:
1)如果我根本不重新进行,则程序在输出后根据i == 32000(最终2 ^ 15)进行长时间休息,然后继续i == 262000(2 ^ 18).它永远存在(100%CPU负载,内存不增加).
2)如果我做了rehash(1000),它来到i == 65000(2 ^ 16)并永远保持(CPU负载100%,内存不增加).
3)如果我这样做rehash(3000000),循环成功完成,但程序永远不会退出 - 即,显然析构函数存在一些问题.
那里发生了什么,更重要的是:我该怎么办呢?!
非常感谢您的帮助!
Connect 上的以下错误似乎与您的问题有关:Visual C++: std::unordered_map Destructor Performance in Debug Configuration
同样的问题不仅发生在析构函数中,而且在unordered_map调整大小时也会发生。如果启用了迭代器调试,这似乎与使迭代器无效有关。
他们说这个问题已经在 VC11 中修复了。还列出了几种解决方法,但我还没有尝试过。
解决调试和发布版本的性能问题的一个非常简单的方法是在“配置选项/C/C++/预处理器/预处理器定义”下的项目选项中设置_SECURE_SCL=0和,这会完全禁用所有迭代器调试。_HAS_ITERATOR_DEBUGGING=0然而,这也会禁用一些安全检查,因此您需要在自己的代码中更加小心。我相信这两个都是发布版本下的默认设置,因此您不需要更改任何内容。
这似乎与您的示例代码的问题有关。我不确定原来的问题,因为你没有说抛出了什么异常。