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

Posted

技术标签:

【中文标题】为啥这些 C++ STL 无序集不被视为相等?【英文标题】:Why aren't these C++ STL unordered sets considered equal?为什么这些 C++ STL 无序集不被视为相等? 【发布时间】:2012-09-28 22:25:14 【问题描述】:

我希望下面的两个无序集被评估为等价的,但令我惊讶的是它们不是。发生这种情况是因为这两个字符串存储在同一个哈希桶中,并且 operator== 对集合中的项目进行顺序比较。这是否应该被视为 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
   

【问题讨论】:

使用 C++ 标准库的哪个实现?这是旧版本 Visual C++ 标准库实现中的一个已知问题(此问题已在 Visual C++ 2012 中修复)。 对不起,我忘了包括那个。我正在使用 Visual C++ 2010。你有关于这个问题的任何文档吗?我搜索时找不到任何东西。谢谢!! Microsoft Connect 上有一个错误。或者,Microsoft Connect 上应该有一个错误——我打开了它。这个错误似乎已经消失了。我正试图弄清楚它去了哪里。 【参考方案1】:

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

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

【讨论】:

@Dani:实际上,直接的变通方法通常是处理编译器和库错误的最佳方法。每个编译器和库实现都有错误——很多,任何足够大的项目都必然会遇到一个或多个错误。

以上是关于为啥这些 C++ STL 无序集不被视为相等?的主要内容,如果未能解决你的问题,请参考以下文章

KeyValuePairs 如何比较相等?

为啥这些数字不相等?

为啥这些日期时间对象时区不相等?

C++ STL与迭代器

浮点数比较为啥没有相等的函数

C++实现多级排序