web-dev-qa-db-ja.com

マップを介したC ++ループ

その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?  
       }
}
137
NoName

あなたは次のようにこれを達成することができます:

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

以下を試してください

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

mapvalue_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';
}
12
Columbo

Moscowの@Vladが言うように、value_typestd::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の意味を理解するために。

4
John Mutuma