2
votes

std :: for_each () pour une carte donne une erreur d'initialisation invalide

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?


1 commentaires

@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.


3 Réponses :


6
votes

Le type d'élément de std :: multimap est std :: pair < / code>. Notez le const


0 commentaires

3
votes

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>


3 commentaires

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!



1
votes

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...
}


0 commentaires