web-dev-qa-db-fra.com

Comment puis-je imprimer des valeurs de carte C ++?

J'ai un map comme ceci:

map<string, pair<string,string> > myMap;

Et j'ai inséré des données dans ma carte en utilisant:

myMap.insert(make_pair(first_name, make_pair(middle_name, last_name)));

Comment puis-je maintenant imprimer toutes les données de ma carte?

43
user1422866
for(map<string, pair<string,string> >::const_iterator it = myMap.begin();
    it != myMap.end(); ++it)
{
    std::cout << it->first << " " << it->second.first << " " << it->second.second << "\n";
}

En C++ 11, vous n'avez pas besoin d'épeler map<string, pair<string,string> >::const_iterator. Vous pouvez utiliser auto

for(auto it = myMap.cbegin(); it != myMap.cend(); ++it)
{
    std::cout << it->first << " " << it->second.first << " " << it->second.second << "\n";
}

Notez l'utilisation des fonctions cbegin() et cend().

Plus facile encore, vous pouvez utiliser la boucle for basée sur la plage:

for(auto elem : myMap)
{
   std::cout << elem.first << " " << elem.second.first << " " << elem.second.second << "\n";
}
72
Armen Tsirunyan

Si votre compilateur prend en charge (au moins une partie de) C++ 11, vous pouvez faire quelque chose comme:

for (auto& t : myMap)
    std::cout << t.first << " " 
              << t.second.first << " " 
              << t.second.second << "\n";

Pour C++ 03, j'utiliserais std::copy avec un opérateur d’insertion à la place:

typedef std::pair<string, std::pair<string, string> > T;

std::ostream &operator<<(std::ostream &os, T const &t) { 
    return os << t.first << " " << t.second.first << " " << t.second.second;
}

// ...
std:copy(myMap.begin(), myMap.end(), std::ostream_iterator<T>(std::cout, "\n"));
22
Jerry Coffin

Depuis C++ 17 , vous pouvez utiliser basé sur une plage pour les boucles avec liaisons structurées pour effectuer une itération sur votre carte. Cela améliore la lisibilité, car vous réduisez le nombre de membres first et second nécessaires dans votre code:

std::map<std::string, std::pair<std::string, std::string>> myMap;
myMap["x"] = { "a", "b" };
myMap["y"] = { "c", "d" };

for (const auto &[k, v] : myMap)
    std::cout << "m[" << k << "] = (" << v.first << ", " << v.second << ") " << std::endl;

Sortie:

m [x] = (a, b)
m [y] = (c, d)

Code sur Colir

5
honk