そのstring-int値やキーを知らなくても、map<string, int>
内の各要素を繰り返し処理したいのです。
私がこれまでに持っているもの:
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?
}
}
あなたは次のようにこれを達成することができます:
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 ;
}
ありC++ 11 (そしてそれ以降)、
for (auto const& x : symbolTable)
{
std::cout << x.first // string (key)
<< ':'
<< x.second // string's value
<< std::endl ;
}
とC++ 17 (そしてそれ以降)、
for( auto const& [key, val] : symbolTable )
{
std::cout << key // string (key)
<< ':'
<< val // string's value
<< std::endl ;
}
以下を試してください
for ( const auto &p : table )
{
std::cout << p.first << '\t' << p.second << std::endl;
}
普通のforループを使って同じことを書くことができます
for ( auto it = table.begin(); it != table.end(); ++it )
{
std::cout << it->first << '\t' << it->second << std::endl;
}
std::map
のvalue_typeが次のように定義されていることを考慮してください。
typedef pair<const Key, T> value_type
したがって、私の例ではpはvalue_typeへのconst参照で、Keyはstd::string
、Tはint
です。
また、関数が次のように宣言されているともっと良いでしょう。
void output( const map<string, int> &table );
map
のvalue_type
は、それぞれpair
およびfirst
メンバーであるため、キーと値を含むsecond
です。
map<string, int>::iterator it;
for (it = symbolTable.begin(); it != symbolTable.end(); it++)
{
std::cout << it->first << ' ' << it->second << '\n';
}
またはC++ 11では、次のものに範囲ベースを使用します。
for (auto const& p : symbolTable)
{
std::cout << p.first << ' ' << p.second << '\n';
}
Moscowの@Vladが言うように、value_type
のstd::map
は次のように定義されていることを考慮してください。
typedef pair<const Key, T> value_type
これはつまり、キーワードauto
をより明示的な型指定子で置き換えたい場合、これが可能です。
for ( const pair<const string, int> &p : table ) {
std::cout << p.first << '\t' << p.second << std::endl;
}
この場合のauto
の意味を理解するために。