C++ <;散列集>;相等运算符不';我不在VS2010工作

C++ <;散列集>;相等运算符不';我不在VS2010工作,c++,visual-studio-2010,C++,Visual Studio 2010,示例代码: std::hash_set<int> hs1; // also i try std::unordered_set<int> - same effect std::hash_set<int> hs2; hs1.insert(15); hs1.insert(20); hs2.insert(20); hs2.insert(15); assert(hs1 == hs2); std::hash_set hs1;//我还尝试了std::无序_集-同样

示例代码:

std::hash_set<int> hs1; // also i try std::unordered_set<int> - same effect 
std::hash_set<int> hs2;

hs1.insert(15);
hs1.insert(20);

hs2.insert(20);
hs2.insert(15);

assert(hs1 == hs2);
std::hash_set hs1;//我还尝试了std::无序_集-同样的效果
std::hash_set hs2;
hs1.插入(15);
hs1.插入(20);
hs2.插入(20);
hs2.插入(15);
断言(hs1==hs2);
哈希_集合不按哈希函数定义的顺序存储元素。。。为什么?
请注意,此代码在VS2008中使用stdext::hash_set工作。

最终在23.2.5的最终草案中找到了参考,注11:

如果
a.size()==b.size()
,则两个无序容器
a
b
比较相等,并且对于从
a.equal\u range(Ea1)
获得的每个等价密钥组
b.equal\u range(Ea1)
,存在从
b.equal\u range(Ea1)获得的等价密钥组
,使得
距离(Ea1,Ea2)=距离(Eb1,Eb2)
是置换(Ea1,Ea2,Eb1)
返回
真值

我敢打赌
散列集
现在是按照
无序集
来实现的(首先),但我仍然不明白为什么在您的情况下它会失败


复杂情况下的复杂性要求是O(n),但由于线性链接实现要求,在最坏情况下退化为O(n2)。

< P>在Visual C++ 2010中,对于<代码> HASHYSET> <代码>和<代码>无序-SET/<代码>,均存在相等的比较。 我使用标准中的语言为无序容器实现了一个朴素的相等函数,以验证这是一个bug(只是为了确保):

模板
布尔相等(常量无序容器和c1,常量无序容器和c2)
{
typedef typename无序容器::value_type元素;
typedef typename无序容器::常量迭代器迭代器;
typedef std::pair IteratorPair;
如果(c1.size()!=c2.size())
返回false;
for(迭代器it(c1.begin());it!=c1.end();+it)
{
迭代器空气er1(c1.等_范围(*it));
迭代器空气er2(c2.等_范围(*it));
如果(标准::距离(er1.first,er1.second)!=
标准:距离(er2.第一,er2.第二)
返回false;
//is_置换的一个完全幼稚的实现:
std::向量v1(er1.first,er1.second);
std::向量v2(er2.first,er2.second);
排序(v1.begin(),v1.end());
排序(v2.begin(),v2.end());
如果(!std::equal(v1.begin()、v1.end()、v2.begin())
返回false;
}
返回true;
}
它返回您示例中的
hs1
hs2
是相等的。(如果您发现代码中有错误,请告诉我;我并没有对其进行广泛测试…)

我将在Microsoft Connect上提交一份缺陷报告。

我问了这个问题,但没有回答=) 谢谢你的反馈

我还创建了一些简单的控制台测试(只是为了确保):

使用vs2010命令提示符:

cl.exe HashSetTest.cpp /oHashSetTest2008.exe 
cl.exe HashSetTest.cpp /oHashSetTest2010.exe

我真的看到了不同的结果=)

你是说你期望
hs1==hs2
是真的,还是说它们是相等的,你不明白为什么?我不明白为什么它们不相等=)这个断言失败了,这是一个问题,我发现了一个解决方案boost::unordered_set.。但我再一次对Billy和他的茶感到失望mDefect report link:谢谢James:)我不确定您的比较是否最佳,但我也没有看到任何明显的错误。无论如何,即使没有我从标准中收集的代码,
unordered_集
equality等同于
set
equality,并且不应该依赖于插入的顺序或删除的可能性。
cl.exe HashSetTest.cpp /oHashSetTest2008.exe 
cl.exe HashSetTest.cpp /oHashSetTest2010.exe