2012-09-28 46 views
5

我预计下面的两个无序集被评估为等效,但令我惊讶的是他们不是。发生这种情况的原因是两个字符串存储在同一个散列桶中,并且运算符==会对该集合中的项目进行顺序比较。这应该被认为是std :: unordered_set中的一个错误吗?有没有人有这个优雅的解决方法?为什么这些C++ STL无序集合被认为是相等的?

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中得到解决)。 –

+0

对不起,我忘了包括那个。我正在使用Visual C++ 2010.您是否有任何关于此问题的文档?我搜索时找不到任何东西。谢谢!! – user1707438

+1

@ user1707438这里是詹姆斯的[回复](http://stackoverflow.com/a/2774236/241631)到一个早先的问题,其中包含'unordered_set'的相等比较器。 – Praetorian

回答

4

这是Visual C++ 2010标准库实现中的一个已知错误。此错误已在Visual C++ 2012中得到修复;如果这个bug影响到你,那么可能值得升级。 (有a bug on Microsoft Connect,但它似乎已经消失;我试图弄清楚发生了什么)

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

+0

解决错误的编译器不是解决方法。 – Dani

+3

@Dani:实际上,简单的解决方法通常是处理编译器和库错误的最佳方法。每个编译器和库实现都有bug(很多),任何足够大的项目都会碰到一个或多个这样的bug。 –

相关问题