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


216

map<string, int>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?  
       }
}

回答:


488

これは次のように実現できます。

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

7
「it」の前に「auto」タイプを追加
iedoc

2
@ P0WなぜC ++ 11では「auto const&」がC ++ 17では「const auto&」なのですか?「auto const&」と「const auto&」の違いは何ですか?
Eric

35
違いはありません、それは単に好みの問題です。しかし、それは@ P0Wの味があまり一貫していないようです...
カピチュ

15
C ++ 17で更新してくれてありがとう、私はauto const& [key, val] : symbolTableフォーマットを探していました!

3
@haramプロジェクト設定([構成プロパティ]> [C / C ++]> [言語]> [C ++言語標準])で「ISO C ++ 17標準(/ std:c ++ 17)」を設定する必要がある場合がある
Swordfish

27

以下をお試しください

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

value_type std::mapが次のように定義されていることを考慮してください

typedef pair<const Key, T> value_type

したがって、私の例では、pはvalue_typeへのconst参照で、Keyは std::string T、Tはint

また、関数が次のように宣言されている場合、それはより良いでしょう。

void output( const map<string, int> &table );

14

value_typea mapは、それぞれpairキーと値を含むa firstsecondメンバーです。

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

7

モスクワの@Vladが言うように、value_typefor 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この場合に何が変換されるかを理解するためだけに。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.