std::string, comme une clé dans une std::map à l'aide d'un comparer opérateur
Je suis en train d'utiliser un std::string, comme une clé dans une std::map cependant, je suis incapable de trouver() correctement. Mon code est un peu compliqué et large donc c'est un petit programme qui illustre le problème que je vais avoir. Si quelqu'un pouvait me dire pourquoi cela ne fonctionne pas, je lui en serais très reconnaissant.
Grâce.
#include <stdio.h>
#include <string>
#include <map>
struct comparer
{
public:
bool operator()(const std::string x, const std::string y)
{
return x.compare(y)==0;
}
};
int main(int argc, char *argv[])
{
std::map<std::string, int, comparer> numbers;
numbers.insert(std::pair<std::string,int>("One",1));
numbers.insert(std::pair<std::string,int>("Two",2));
numbers.insert(std::pair<std::string,int>("Three",3));
numbers.insert(std::pair<std::string,int>("Four",4));
numbers.insert(std::pair<std::string,int>("Five",5));
std::map<std::string, int, comparer>::iterator it=numbers.find("Three");
if(it!=numbers.end())
printf("The number is %d\n",(*it).second);
else
printf("Error, the number is not found\n");
}
OriginalL'auteur Chromex | 2011-12-04
Vous devez vous connecter pour publier un commentaire.
Supprimer votre
comparer
et il fonctionne très bien. La chose est, vous n'avez pas le mettre en œuvre correctement. Il doit retournertrue
six
est placé avanty
. Ou changer==0
à<0
ou>0
(il n'a pas vraiment d'importance).Vous êtes les bienvenus, mais vous êtes sûr de confondre à propos de l'enlèvement. Si vous remplacez toutes les occurences de
std::map<std::string, int, comparer>
avecstd::map<std::string, int>
il sera sûr de travail.Le problème que j'ai dans mon application principale est que je dois vérifier les doublons dans la carte avant d'ajouter une nouvelle paire. Cependant, il n'est pas détecter les doublons correctement
Je parlais de ce code, pas à votre demande, bien sûr. Comme pour les doublons,
map
n'est pas permis d'avoir tout contrairement àmultimap
.en fait, ce ne semble pas être le cas, quand j'ai ajouter deux paires qui ont la même valeur de clé, parcourant la carte montre 2 entrées avec la même clé.
OriginalL'auteur Michael Krelin - hacker
comparer::operator()
doit retourner la valeur de l'opérateur <, et non de l'opérateur ==.OriginalL'auteur Griwes
std::map
(etset
et leurmulti
variantes) de faire appliquer les faible stricte de la commande.Renverra vrai si les chaînes sont l'égalité des. La comparaison doit retourner si la première chaîne doit aller de l'avant de la deuxième chaîne. Retour
x.comparer(y) < 0
ou tout simplement laisser votre comparaison foncteur.OriginalL'auteur Xeo
Cela devrait fonctionner:
OriginalL'auteur 李则博