J'ai une question sur la façon de trouver l'élément correspondant qui a au moins un numéro de données égal à la clé recherchée dans un fichier de type std::map
avec des structures.
Par exemple, supposons que je doive trouver le numéro de téléphone d'une personne avec son nom ou dans un répertoire téléphonique (supposons qu'il n'y a pas de nom utilisé par plus d'une personne), je vais déclarer un fichier struct
nommé Person
et définir une std::map
contenant Person
et son numéro de téléphone (en std::string
) :
struct Person {
std::string name;
std::string id;
};
std::map<Person, std::string> phonebook;
En cherchant sur Internet, j'ai découvert que les besoins de la structure étaient surchargés. ==
y <
des opérateurs avec lesquels travailler std::map
et les a mis en œuvre :
bool operator==(const Person &person1, const Person &person2) {
return person1.name == person2.name || person1.id == person2.id;
}
bool operator<(const Person &person1, const Person &person2) {
return person1.id < person2.id;
}
J'ai utilisé des "ou" logiques ( ||
) dans la version surchargée de ==
opérateur afin d'implémenter la fonctionnalité permettant de trouver le numéro de téléphone avec le nom d'une personne. ou au lieu d'avoir besoin des deux.
J'ai écrit un peu de code pour tester la fonctionnalité :
// Add some entries
phonebook[{"Jack", "001"}] = "12345";
phonebook[{"Mike", "002"}] = "12346";
phonebook[{"Eric", "003"}] = "12347";
// Search by name
std::map<Person, std::string>::iterator iter = phonebook.find({"Jack", ""});
if (iter == phonebook.end())
std::cout << "Cannot find the phone number for Jack" << std::endl;
else
std::cout << "Jack's phone number is " << iter->second << std::endl;
// Search by id
iter = phonebook.find({"", "001"});
if (iter == phonebook.end())
std::cout << "Cannot find the phone number for 001" << std::endl;
else
std::cout << "001's phone number is " << iter->second << std::endl;
Cependant, j'ai constaté que la recherche par id fonctionne très bien, mais que la recherche par nom ne peut pas fonctionner. Quel que soit le nom recherché, le numéro de téléphone ne peut jamais être trouvé. Le code du test ci-dessus produit le résultat suivant :
Cannot find the phone number for Jack
001's phone number is 12345
alors que le résultat attendu est
Jack's phone number is 12345
001's phone number is 12345
De plus, si je modifie la façon dont j'implémente la fonction surchargée <
l'opérateur à
bool operator<(const Person &person1, const Person &person2) {
return person1.name < person2.name; // change "id" to "name"
}
alors la recherche par nom fonctionne bien, mais la recherche par id ne fonctionnera pas.
Alors, comment puis-je mettre en œuvre la fonction (pour trouver le numéro de téléphone d'une personne avec son nom) ? ou id) avec std::map
? Ou bien est-il impossible de le mettre en œuvre de cette manière ?
Merci d'avance !