我想要做的是使我可以使用std :: unordered_set與我自定義類Vector2 - 包括可能性搜索已經在集合中的這種類的對象。設置一個自定義類用於無序設置元素不能在設置中找到
讓我來提供更多細節。我的課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());
}
};
}
等類的memeber功能的實現很簡單:
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
中,但是當它們在這樣的集合內搜索時,它們以後未找到。
我在做什麼錯?
你正在執行'hash'錯誤。我們要求,如果'a == b',那麼'hash(a)== hash(b)'。 – kennytm
除了SingerOfTheFalls答案,請注意'Vector2'的複製構造函數將創建另一個具有相同ID的'Vector2'對象。這可能是也可能不是你想要的。 –
@MartinBonner感謝您指出這一點!的確,在我的理想情況下,所有具有相同'x'和相同'y'的Vector2'對象將具有相同的'id',但我想這對於這種特殊情況來說並不重要,對吧? – Andy