1. ホーム
  2. c++

[解決済み] std::mapで範囲指定for()ループを使用するには?

2022-03-27 05:33:46

質問

C++11の範囲ベースのfor()ループの一般的な例は、いつもこのような簡単なものです。

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

この場合 xyzint . しかし、マップのようなものがある場合はどうなるのでしょうか? この例では、変数の型はどうなっているのでしょう。

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.6+にあるのに、私はまだg++ 4.4なので、まだ試す機会がないのです)。

どのように解決するのですか?

コンテナの各要素は map<K, V>::value_type であり、これは typedef に対して 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 を使用すると、値を読み取り専用で表示できます。