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?
}
}
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 ;
}
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 );
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';
}
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.