为什么这些C++ STL无序集不被视为相等?

5
我原以为下面的两个无序集合会被认为是相等的,但令我惊讶的是它们并不相同。这是因为这两个字符串存储在同一个哈希桶中,而operator==对集合中的项目进行顺序比较。这是否应该被认为是std::unordered_set中的一个bug?是否有任何优雅的解决方法?
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
{   
}

7
使用哪个C++标准库实现?这是在旧版本的Visual C++标准库实现中已知的问题(该问题已在Visual C++ 2012中得到修复)。 - James McNellis
抱歉,我忘记了。我正在使用Visual C++ 2010。你有关于这个问题的文档吗?当我搜索时,我找不到任何东西。谢谢! - user1707438
1
@user1707438 这里是James对早期问题的答案,其中包含了一个用于unordered_set的等式比较器。 - Praetorian
1
Microsoft Connect上有一个bug。或者说,应该在Microsoft Connect上有一个bug——我已经打开了它。但是这个bug似乎消失了。我正在努力找出它去了哪里。 - James McNellis
1个回答

4
这是Visual C++ 2010标准库实现中已知的一个bug。在Visual C++ 2012中,该bug已得到修复;如果此bug正在影响您,升级可能值得考虑。(有Microsoft Connect上的一个bug,但它似乎已经消失了;我正在努力弄清楚它发生了什么。)
作为解决方法,请考虑是否真的需要使用无序关联容器--它们的性能不一定比有序关联容器的性能更好。

3
@Dani:实际上,直接的解决方法通常是处理编译器和库错误的最佳方式。每个编译器和库实现都存在错误 - 很多错误,任何足够大的项目都有可能遇到其中一个或多个错误。 - James McNellis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接