#include <unordered_set>
#include <iostream>
class edge{
public:
float a1;
float a2;
};
struct comp{
bool operator()(const edge& e1, const edge& e2) const {
return true;
return (
(e1.a1==e2.a1 && e1.a2==e2.a2) ||
(e1.a1==e2.a2 && e1.a2==e2.a1)
);
};
};
struct hash{
size_t operator()(const edge& e1) const {
// return std::hash<float>()(e1.a1+e1.a2);
return std::hash<float>()(e1.a1+e1.a2*2);
};
};
int main() {
std::unordered_set<edge,hash,comp> s1;
s1.insert(edge{1.1,2.2});
s1.insert(edge{2.2,1.1});
for( auto& it : s1 ) {
std::cout << it.a1 << " " << it.a2 << "\n";
}
std::cout << "s1.size " << s1.size() << "\n";
}
我意识到如果不同的元素具有相同的哈希值,那么它们被认为是相等的,但我只希望这个 unordered_set 使用我定义的比较器,只是忽略哈希?
如何做到这一点?
我知道我可以使用set,但是使用set需要考虑顺序,如果a < b 为真,b < a 也为真,那么这个元素不会插入成功,有时,很难提供顺序。
如果有人可以提供帮助,不胜感激
编辑:我的意图是让两条边称为 e1,e2,如果(e1.a1==e2.a1&&e1.a2==e2.a2)或(e1.a1==e2.a2 && e1.a2==e2.a1)与我在 struct comp 中提供的一样,它们是相同的。但是当我测试时。似乎哈希函数也可以改变比较。有人说我定义哈希和比较器的方式会导致未定义的行为。真的吗?为什么?如果是真的,如何解决这个问题?我只想让比较器决定将哪一个满足插入 unordered_set 而不重复。而且真的不关心哈希。
顺便说一句,感谢很多人回复