gpt4 book ai didi

c++ - 如何将unordered_set与自定义结构一起使用?

转载 作者:行者123 更新时间:2023-12-02 10:57:21 26 4
gpt4 key购买 nike

我想使用带有自定义unordered_setstruct。就我而言,自定义struct代表欧几里得平面中的2D点。我知道应该定义一个哈希函数和比较器运算符,并且您已经在下面的代码中看到了:

struct Point {
int X;
int Y;

Point() : X(0), Y(0) {};
Point(const int& x, const int& y) : X(x), Y(y) {};
Point(const IPoint& other){
X = other.X;
Y = other.Y;
};

Point& operator=(const Point& other) {
X = other.X;
Y = other.Y;
return *this;
};

bool operator==(const Point& other) {
if (X == other.X && Y == other.Y)
return true;
return false;
};

bool operator<(const Point& other) {
if (X < other.X )
return true;
else if (X == other.X && Y == other.Y)
return true;

return false;
};

size_t operator()(const Point& pointToHash) const {
size_t hash = pointToHash.X + 10 * pointToHash.Y;
return hash;
};
};

但是,如果我按以下方式定义集合,则会出现以下错误:
unordered_set<Point> mySet;

Error C2280 'std::hash<_Kty>::hash(const std::hash<_Kty> &)': attempting to reference a deleted function



我想念什么?

最佳答案

std::unordered_set的第二个模板参数是用于哈希的类型。并根据您的情况默认为​​std::hash<Point>(不存在)。因此,如果散列器的类型相同,则可以使用std::unordered_set<Point,Point>

或者,如果您不想指定哈希器,则为std::hash定义Point的特殊化,并摆脱成员函数,并在您的特殊化operator()的主体中实现哈希,或者从std::hash特殊化中调用成员函数。

#include <unordered_set>

struct Point {
int X;
int Y;

Point() : X(0), Y(0) {};
Point(const int& x, const int& y) : X(x), Y(y) {};
Point(const Point& other){
X = other.X;
Y = other.Y;
};

Point& operator=(const Point& other) {
X = other.X;
Y = other.Y;
return *this;
};

bool operator==(const Point& other) const {
if (X == other.X && Y == other.Y)
return true;
return false;
};

bool operator<(const Point& other) {
if (X < other.X )
return true;
else if (X == other.X && Y == other.Y)
return true;

return false;
};

// this could be moved in to std::hash<Point>::operator()
size_t operator()(const Point& pointToHash) const noexcept {
size_t hash = pointToHash.X + 10 * pointToHash.Y;
return hash;
};

};

namespace std {
template<> struct hash<Point>
{
std::size_t operator()(const Point& p) const noexcept
{
return p(p);
}
};
}


int main()
{
// no need to specify the hasher if std::hash<Point> exists
std::unordered_set<Point> p;
return 0;
}

Demo

关于c++ - 如何将unordered_set与自定义结构一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58846350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com