C ++ Schleife durch Karte

216

Ich möchte jedes Element in durchlaufen, map<string, int>ohne einen seiner String-Int-Werte oder Schlüssel zu kennen.

Was ich bisher habe:

void output(map<string, int> table)
{
       map<string, int>::iterator it;
       for (it = table.begin(); it != table.end(); it++)
       {
            //How do I access each element?  
       }
}
Kein Name
quelle
3
Mögliches Duplikat von Wie man eine C ++
durchläuft

Antworten:

487

Sie können dies wie folgt erreichen:

map<string, int>::iterator it;

for ( it = symbolTable.begin(); it != symbolTable.end(); it++ )
{
    std::cout << it->first  // string (key)
              << ':'
              << it->second   // string's value 
              << std::endl ;
}

Mit C ++ 11 (ff) ,

for (auto const& x : symbolTable)
{
    std::cout << x.first  // string (key)
              << ':' 
              << x.second // string's value 
              << std::endl ;
}

Mit C ++ 17 (ff) ,

for( auto const& [key, val] : symbolTable )
{
    std::cout << key         // string (key)
              << ':'  
              << val        // string's value
              << std::endl ;
}
P0W
quelle
7
Fügen
2
@ P0W Warum "auto const &" für C ++ 11, aber "const auto &" für C ++ 17? Gibt es einen Unterschied zwischen "auto const &" und "const auto &"?
Eric
35
Es gibt keinen Unterschied, es ist nur eine Frage des Geschmacks. Es scheint jedoch, dass @ P0W 's Geschmack nicht sehr konsequent ist ...
Kapichu
15
Vielen Dank für die Aktualisierung mit C ++ 17, ich habe nach dem auto const& [key, val] : symbolTableFormat gesucht !
Wasser
3
@haram Möglicherweise müssen Sie "ISO C ++ 17 Standard (/ std: c ++ 17)" in den Projekteinstellungen festlegen (Konfigurationseigenschaften> C / C ++> Sprache> C ++ Sprachstandard)
Swordfish
27

Versuche Folgendes

for ( const auto &p : table )
{
   std::cout << p.first << '\t' << p.second << std::endl;
} 

Das gleiche kann mit einer gewöhnlichen for-Schleife geschrieben werden

for ( auto it = table.begin(); it != table.end(); ++it  )
{
   std::cout << it->first << '\t' << it->second << std::endl;
} 

Berücksichtigen Sie, dass value_type for std::mapfolgendermaßen definiert ist

typedef pair<const Key, T> value_type

In meinem Beispiel ist p also eine konstante Referenz auf den value_type, wobei Key std::stringund T istint

Es wäre auch besser, wenn die Funktion als deklariert würde

void output( const map<string, int> &table );
Vlad aus Moskau
quelle
14

Das value_typevon a mapist a und pairenthält den Schlüssel und den Wert als es firstbzw. secondMitglied.

map<string, int>::iterator it;
for (it = symbolTable.begin(); it != symbolTable.end(); it++)
{
    std::cout << it->first << ' ' << it->second << '\n';
}

Oder mit C ++ 11 unter Verwendung von bereichsbasiert für:

for (auto const& p : symbolTable)
{
    std::cout << p.first << ' ' << p.second << '\n';
}
Columbo
quelle
7

Wie @Vlad aus Moskau sagt, berücksichtigen Sie, dass value_typefür wie std::mapfolgt definiert ist:

typedef pair<const Key, T> value_type

Dies bedeutet dann, dass Sie dies tun können, wenn Sie das Schlüsselwort autodurch einen expliziteren Typbezeichner ersetzen möchten .

for ( const pair<const string, int> &p : table ) {
   std::cout << p.first << '\t' << p.second << std::endl;
} 

Nur um zu verstehen, was autoin diesem Fall bedeutet.

John Mutuma
quelle