Hoe kan ik C++-kaartwaarden afdrukken?

Ik heb een mapzoals deze:

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

En ik heb wat gegevens in mijn kaart ingevoegd met:

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

Hoe kan ik nu alle gegevens op mijn kaart afdrukken?


Antwoord 1, autoriteit 100%

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";
}

In C++11 hoeft u map<string, pair<string,string> >::const_iterator. U kunt auto

. gebruiken

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

Let op het gebruik van de functies cbegin()en cend().

Nog gemakkelijker, je kunt de op bereik gebaseerde for-lus gebruiken:

for(const auto& elem : myMap)
{
   std::cout << elem.first << " " << elem.second.first << " " << elem.second.second << "\n";
}

Antwoord 2, autoriteit 26%

Als je compiler (ten minste een deel van) C++11 ondersteunt, kun je zoiets doen als:

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

Voor C++03 zou ik in plaats daarvan std::copygebruiken met een invoegoperator:

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"));

Antwoord 3, autoriteit 23%

Sinds C++17kunt u range-based for loopssamen met gestructureerde bindingenvoor het herhalen van uw kaart. Dit verbetert de leesbaarheid, aangezien u het aantal benodigde firsten secondleden in uw code vermindert:

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;

Uitvoer:

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

Code op Coliru

Other episodes