2017-10-06 4 views
-4

Je créé une carte comme ceci: std::map<int, std::string> mapID;Carte en C++ donne la clé et obtenir la chaîne

INPUT: mapID [1] = "! String";

et je veux imprimer élément avec la clé est le s. Par exemple

cout << "The string is : " << mapID.at(s)->second << endl; 

OU

cout << "The string is : " << mapID.find(s)->second << endl; 

Mais j'ai l'erreur

error: no matching function for call to ‘std::map >::at(std::string&)’

MISE À JOUR:

while(getline(file,s)) 
        { 
          cout<< s << endl; 
          number = atoi(s.c_str()); 

         cout << "The string is: " << mapID.at(number)<< endl; 
} 
+3

s'il vous plaît montrer un [mcve]. '1' n'est évidemment pas une chaîne, donc il y a quelque chose de louche mais il faut voir plus de code pour reproduire le problème – user463035818

+0

mapID [1] va créer un élément à 1 s'il n'existe pas – rak007

+1

Votre code listé ne peut pas produire le donné Message d'erreur. S'il vous plaît nous montrer le code réel, ou le message d'erreur réel. (De préférence en tant que [mcve] que nous pouvons couper et coller dans (par exemple) cpp.sh.) –

Répondre

3

Si vous regardez la référence http://en.cppreference.com/w/cpp/container/map/at vous verrez que la méthode "at" retourne un deuxième élément de paire. Dans votre cas, c'est std :: string.

Le code doit être

cout << "The string is : " << mapID.at(1) << endl; 
+2

vrai, mais il n'explique pas le message d'erreur signalé – user463035818

+0

Le message d'erreur est expliqué en observant que la méthode 'at()' recevoir une clé value, donc dans 'std :: map ', il est disponible 'at (int const &)', pas 'at (std :: string const &)' – max66

-1

Depuis C++ 11, .at() renvoie une référence à la valeur mappée de l'élément identifié avec clé k.

Votre exemple était bon si vous utilisiez un itérateur car vous pouvez alors accéder à votre élément de paire créé par votre carte.

Voici un exemple avec un iterator

auto it = mapID.find(1); 
cout << "The string is : " << it->second << endl; 

OU avec .at()

cout << "The string is : " << mapID.at(1) << endl; 

Mais méfiez-vous que .at() jetteront si l'élément ne se trouve pas dans votre carte comme il peut » t le créer comme l'opérateur []

+1

en supposant que OP reçoive le message d'erreur qu'ils rapport, ils recevraient toujours le même message d'erreur avec ce "correctif". (Pareil s'applique aux autres "réponses"). Quel est le point de se précipiter avec des réponses lorsque la question n'est pas claire du tout? – user463035818

+0

@ tobi303 _ "Quel est le point de se précipiter" _ FGITW comme il a toujours été: P ... – user0042

+0

@ tobi303 Il a appelé -> deuxième sur un élément std :: string au lieu d'un itérateur, c'était son erreur, je l'explique dans ma réponse – rak007