为什么 unordered_set 的元素对于自定义 equal_to 不是唯一的
why are elements of unordered_set not unique for custom equal_to
我正在努力更好地理解 unordered_set。主要是,根据我的理解, unordered_set 中的元素在 equal_to 运算符之前应该是唯一的。
因此,我决定通过一小段代码来测试一下
#include <iostream>
#include <unordered_set>
using namespace std;
struct m_int
{
int x;
};
// template specialization for std::hash
template<>
struct std::hash<m_int>
{
std::size_t operator()(m_int const& x) const noexcept
{
return hash<int>{}(x.x);
}
};
//template specialization for std::equal_to
template<>
struct std::equal_to<m_int>
{
bool operator()(const m_int &lhs, const m_int &rhs) const
{
return abs(lhs.x-rhs.x)<=3;
}
};
int main() {
unordered_set<m_int> m={{1},{2},{3},{4}};
for(auto&x:m)
cout<<x.x<<' ';
cout<<endl;
cout<<m.count({2})<<endl;
// your code goes here
return 0;
}
我最初的想法是1会插入2,3会插入4。
我得到的输出是
4 3 2 1
1
既然按照我的equal_to1和2是一样的,那么这个集合实际上包含重复,这是违反集合定义的。为什么会这样,我该如何解决?
未排序的容器have the following requirements for their hash and key equality functions:
If two Keys are equal according to Pred, Hash must return the same
value for both keys.
您的容器并非如此。例如,1 和 4 比较相等,但它们(几乎可以肯定)具有不同的哈希值。这会导致未定义的行为。
这里还有一个逻辑问题:1等于4,4等于7,但是1不等于7,这个也不计算。
我正在努力更好地理解 unordered_set。主要是,根据我的理解, unordered_set 中的元素在 equal_to 运算符之前应该是唯一的。 因此,我决定通过一小段代码来测试一下
#include <iostream>
#include <unordered_set>
using namespace std;
struct m_int
{
int x;
};
// template specialization for std::hash
template<>
struct std::hash<m_int>
{
std::size_t operator()(m_int const& x) const noexcept
{
return hash<int>{}(x.x);
}
};
//template specialization for std::equal_to
template<>
struct std::equal_to<m_int>
{
bool operator()(const m_int &lhs, const m_int &rhs) const
{
return abs(lhs.x-rhs.x)<=3;
}
};
int main() {
unordered_set<m_int> m={{1},{2},{3},{4}};
for(auto&x:m)
cout<<x.x<<' ';
cout<<endl;
cout<<m.count({2})<<endl;
// your code goes here
return 0;
}
我最初的想法是1会插入2,3会插入4。
我得到的输出是
4 3 2 1
1
既然按照我的equal_to1和2是一样的,那么这个集合实际上包含重复,这是违反集合定义的。为什么会这样,我该如何解决?
未排序的容器have the following requirements for their hash and key equality functions:
If two Keys are equal according to Pred, Hash must return the same value for both keys.
您的容器并非如此。例如,1 和 4 比较相等,但它们(几乎可以肯定)具有不同的哈希值。这会导致未定义的行为。
这里还有一个逻辑问题:1等于4,4等于7,但是1不等于7,这个也不计算。