为什么这些C++ STL无序集合被认为是相同的?

use*_*438 5 c++ std visual-studio-2010 visual-c++ unordered

我期望下面的两个无序集合被评估为等价,但令我惊讶的是它们不是.发生这种情况是因为两个字符串存储在同一个哈希桶中,而运算符==对集合中的项目进行顺序比较.这应该被视为std :: unordered_set中的错误吗?有人有一个优雅的解决方法吗?

std::unordered_set<std::string> a,b;
a.insert("500666");
a.insert("961021");
b.insert("961021");
b.insert("500666");

if (a == b)   // condition is evaulated as false
{   
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 4

这是 Visual C++ 2010 标准库实现中的一个已知错误。该错误已在 Visual C++ 2012 中修复;如果这个错误正在影响您,那么可能值得考虑升级。(Microsoft Connect 上有一个错误,但它似乎已经消失了;我正在尝试找出它发生了什么。)

作为解决方法,请考虑是否确实需要使用无序关联容器——它们的性能不一定比有序关联容器的性能更好。

  • @Dani:实际上,简单的解决方法通常是处理编译器和库错误的最佳方法。每个编译器和库实现都有错误——数量很多,任何足够大的项目都必然会遇到一个或多个这些错误。 (3认同)