Ce que j'essaie de faire est de rendre possible l'utilisation de std :: unordered_set avec ma classe personnalisée Vector2 - incluant la possibilité pour rechercher des objets de cette classe qui sont déjà dans un ensemble.La définition d'une classe personnalisée à utiliser avec un élément set non ordonné ne peut pas être trouvée dans l'ensemble
Permettez-moi de donner plus de détails. L'en-tête de ma classe Vector2, y compris la table de hachage personnalisé, est la suivante:
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());
}
};
}
La mise en œuvre des fonctions de memeber de cette catégorie est trivial:
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;
}
Ensuite, mes fonctions principales ressemble les éléments suivants:
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;
}
Cependant, alors que je pense que la sortie soit Found it!
, il est en fait Nothing found
. Cela signifie que tandis que les objets Vector2 Vector2(1, 2)
, Vector2(3, 11)
et Vector2(-5, 0)
sont insérés dans mySet
, ils ne sont plus trouvés lors d'une recherche dans un tel ensemble.
Qu'est-ce que je fais mal?
Vous implémentez 'hash' incorrect. Nous demandons que, si 'a == b' alors' hash (a) == hash (b) '. – kennytm
En plus de la réponse de SingerOfTheFalls, sachez que le constructeur de copie de 'Vector2' va créer un autre objet' Vector2' avec le même ID. Cela peut ou peut ne pas être ce que vous voulez. –
@MartinBonner Merci d'avoir signalé cela! En effet, dans mon scénario idéal, tous les objets 'Vector2' qui ont le même' x' et le même 'y' auraient le même' id', mais je suppose que c'est d'une importance mineure pour ce cas particulier, n'est-ce pas? – Andy