std::map で範囲ベースの for() ループを使用するにはどうすればよいでしょうか? 質問する

std::map で範囲ベースの for() ループを使用するにはどうすればよいでしょうか? 質問する

C++11 の範囲ベースの for() ループの一般的な例は常に次のような単純なものになります。

std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 };
for ( auto xyz : numbers )
{
     std::cout << xyz << std::endl;
}

この場合はxyzですint。しかし、マップのようなものがある場合はどうなるでしょうか? この例の変数の型は何でしょうか:

std::map< foo, bar > testing = { /*...blah...*/ };
for ( auto abc : testing )
{
    std::cout << abc << std::endl;         // ? should this give a foo? a bar?
    std::cout << abc->first << std::endl;  // ? or is abc an iterator?
}

トラバースされるコンテナが単純なものである場合、範囲ベースの for() ループは反復子ではなく各項目を返すように見えます。これは便利です...反復子の場合、とにかく最初に行う必要があるのは、それを逆参照することです。

しかし、マップやマルチマップのようなものに関しては何を期待すればよいのか混乱しています。

(私はまだ g++ 4.4 を使用していますが、範囲ベースのループは g++ 4.6 以降にあるため、まだ試す機会がありません。)

ベストアンサー1

コンテナの各要素は でありmap<K, V>::value_type、これはtypedefforですstd::pair<const K, V>。したがって、C++17以降では、次のように記述できます。

for (auto& [key, value]: myMap) {
    std::cout << key << " has value " << value << std::endl;
}

または

for (const auto& [key, value]: myMap) {
    std::cout << key << " has value " << value << std::endl;
}

値を変更する予定がない場合は。

C++11 および C++14 では、拡張forループを使用して各ペアを個別に抽出し、キーと値を手動で抽出できます。

for (const auto& kv : myMap) {
    std::cout << kv.first << " has value " << kv.second << std::endl;
}

値を読み取り専用で表示したい場合は、kv変数をマークすることも検討してください。const

おすすめ記事