web-dev-qa-db-fra.com

Boucle C ++ à travers la carte

Je veux parcourir chaque élément du map<string, int> sans connaître aucune de ses valeurs string-int ni ses clés.

Ce que j'ai jusqu'ici:

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?  
       }
}
153
NoName

Vous pouvez y parvenir comme suit:

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

Avec C++ 11 (et après),

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

Avec C++ 17 (et après),

for( auto const& [key, val] : symbolTable )
{
    std::cout << key         // string (key)
              << ':'  
              << val        // string's value
              << std::endl ;
}
347
P0W

Essayez ce qui suit

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

La même chose peut être écrite en utilisant une boucle for ordinaire

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

Tenez compte du type de valeur pour std::map est défini de la manière suivante

typedef pair<const Key, T> value_type

Ainsi, dans mon exemple, p est une référence constante au type de valeur, où Key est std::string et T est int.

En outre, il serait préférable que la fonction soit déclarée comme

void output( const map<string, int> &table );
25
Vlad from Moscow

Le value_type d'un map est un membre pair contenant la clé et la valeur car il s'agit respectivement du membre first et second.

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

Ou avec C++ 11, en utilisant la plage pour:

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

Comme le dit @Vlad de Moscou, tenez compte du fait que value_type pour std::map est défini de la manière suivante:

typedef pair<const Key, T> value_type

Cela signifie alors que si vous souhaitez remplacer le mot clé auto par un spécificateur de type plus explicite, vous pouvez le faire;

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

Juste pour comprendre ce que auto traduira dans ce cas.

4
John Mutuma