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.