내가하려는 것은 std :: unordered_set을 사용자 정의 클래스 Vector2 - 과 함께 사용하는 것이 가능하도록하는 것입니다 이미 집합에 속한 클래스의 객체를 검색하려면.정렬되지 않은 set 요소에 사용할 사용자 정의 클래스를 설정하는 것이 집합에서 찾을 수 없습니다
좀 더 자세히 알려 드리겠습니다. 사용자 정의 해시 테이블을 포함하여 내 수업 Vector2의 헤더는 다음과 같다 :
Class Vector2
{
private:
static int lastID;
const int id;
int x;
int y;
public:
Vector2(int _x, int _y);
~Vector2();
bool Vector2::operator==(const Vector2& other) const;
int getId() const;
int getX() const;
int getY() const;
};
namespace std
{
template<>
struct hash<Vector2>
{
size_t
operator()(const Vector2& obj) const
{
return hash<int>()(obj.getId());
}
};
}
같은 클래스의 일원이 기능의 구현은 간단하다 :
이int Vector2::lastID = 0;
Vector2::Vector2(int _x, int _y) : id(lastID++)
{
x = _x;
y = _y;
}
int Vector2::getId() const
{
return id;
}
int Vector2::getX() const
{
return x;
}
int Vector2::getY() const
{
return y;
}
bool Vector2::operator==(const Vector2& other) const
{
if (x != other.x || y != other.y) return false;
return true;
}
그런 다음 내 주요 기능의 모습 다음
std::unordered_set<Vector2> mySet;
mySet.insert(Vector2(1, 2));
mySet.insert(Vector2(3, 11));
mySet.insert(Vector2(-5, 0));
Vector2 whatToLookFor(1, 2);
if (mySet.find(whatToLookFor) != mySet.end())
{
std::cout << "Found it!" << std::endl;
}
else
{
std::cout << "Nothing found." << std::endl;
}
을하지만, 내가 출력이 Found it!
것으로 기대하면서, 실제로 Nothing found
입니다. 즉, Vector2 객체 Vector2(1, 2)
, Vector2(3, 11)
및 Vector2(-5, 0)
은 mySet
에 삽입되지만 나중에 해당 세트 내에서 검색 할 때 발견되지 않습니다.
내가 뭘 잘못하고 있니? 다음 h(A) == h(B)
A == B
경우, 일 : unordered_set
에
'해시'를 잘못 구현하고 있습니다. 'a == b'이면'hash (a) == hash (b)'가 필요합니다. – kennytm
SingerOfTheFalls는 "Vector2"의 복사 생성자가 동일한 ID를 가진 또 다른'Vector2' 객체를 생성한다는 점에 유의해야합니다. 그것은 당신이 원하는 것일 수도 아닐 수도 있습니다. –
@MartinBonner 그 점을 지적 해 주셔서 감사합니다! 실제로, 이상적인 시나리오에서, 같은'x'와 같은'y'를 가진 모든'Vector2' 객체는 같은'id'를 가질 것입니다,하지만이 특별한 경우에는별로 중요하지 않다고 생각합니다. 맞습니까? – Andy