Je suis relativement nouveau dans STL et en particulier dans la bibliothèque d'algorithmes.
J'essaie d'itérer sur un std :: multimap
, où la clé et la valeur sont de type std :: string
, en utilisant std :: for_each ()
et effectuez une tâche.
Voici mon std::multimap
:
void ask(std::pair<std::string, std::string>& entry) { // do something... }
Et voici la ligne avec for_each ()
function:
std::for_each(myMap.begin(), myMap.end(), ask);
La fonction ask ()
est définie comme suit:
std::multimap<std::string, std::string> myMap; for (int i = 0; i < 5; i++) { myMap.insert(std::make_pair("key", "value")); }
Le programme me donne l'erreur suivante:
erreur: initialisation invalide de la référence de type 'std :: __ cxx11 :: basic_string &' à partir de l'expression de type 'std :: paire, std :: __ cxx11 :: basic_string> '
Je sais que, le problème est sur la ligne avec la fonction for_each ()
et je suppose que c'est parce que le paramètre de la fonction ask ()
n'est pas correct.
Mais à ma connaissance, chaque entrée du std :: multimap
est représentée comme un std :: pair
, donc pas le ask () code > fonction prend un objet
std :: pair
comme paramètre?
3 Réponses :
Le type d'élément de std :: multimap
est std :: pair
const
L'allocateur par défaut utilisé pour std :: multimap
est
void ask(std::pair<const std::string, std::string>& entry) { }
Les clés de std :: multimap
sont donc const
qui rend le type comme
std::pair<std::string, std::string>
où comme ask ()
attend un paramètre comme référence au type
std::pair<const std::string, std::string>
Remplacez ask ()
par
std::allocator<std::pair<const Key, T>
Je l'ai essayé, mais cela n'a pas fonctionné. Cela donne exactement la même erreur
@HidayetRzayev fonctionne ici
EDIT: désolé, j'ai également oublié d'ajouter const dans ma déclaration de fonction, cela fonctionne parfaitement. Merci!
Plutôt que de deviner le type d'élément de la carte, vous pouvez le demander directement.
using myMap_t = std::multimap<std::string, std::string>; void ask(myMap_t::reference entry) { // do something... } int main() { myMap_t myMap; for (int i = 0; i < 5; i++) { myMap.insert(myMap_t::value_type("key", "value")); } std::for_each(myMap.begin(), myMap.end(), ask); }
Il peut être judicieux de créer un alias de type pour ce type de carte, afin que vous pas besoin de le répéter
void ask(std::multimap<std::string, std::string>::reference entry) { // do something... }
@JeJo La méthode ask () est assez longue, j'ai donc décidé de garder le code plus propre en écrivant une fonction séparée.