C++ のマップのマップをループするにはどうすればいいですか? 質問する

C++ のマップのマップをループするにはどうすればいいですか? 質問する

C++ でループするにはどうすればよいでしょうかstd::map? マップは次のように定義されています:

std::map< std::string, std::map<std::string, std::string> >

たとえば、上記のコンテナーには次のようなデータが保持されます。

m["name1"]["value1"] = "data1";
m["name1"]["value2"] = "data2";
m["name2"]["value1"] = "data1";
m["name2"]["value2"] = "data2";
m["name3"]["value1"] = "data1";
m["name3"]["value2"] = "data2";

このマップをループしてさまざまな値にアクセスするにはどうすればよいでしょうか?

ベストアンサー1

古い質問ですが、残りの回答はC++11では古くなっています。範囲ベースの for ループそして、単に次のようにします:

std::map<std::string, std::map<std::string, std::string>> mymap;

for(auto const &ent1 : mymap) {
  // ent1.first is the first key
  for(auto const &ent2 : ent1.second) {
    // ent2.first is the second key
    // ent2.second is the data
  }
}

これにより、以前のバージョンよりもはるかにクリーンになり、不要なコピーが回避されます。

コメントを参照変数の明示的な定義に置き換えることを支持する人もいます (使用されていない場合は最適化によって削除されます)。

for(auto const &ent1 : mymap) {
  auto const &outer_key = ent1.first;
  auto const &inner_map = ent1.second;
  for(auto const &ent2 : inner_map) {
    auto const &inner_key   = ent2.first;
    auto const &inner_value = ent2.second;
  }
}

C++17 の更新: 次のように、構造化バインディングを使用してこれをさらに簡素化できるようになりました。

for(auto const &[outer_key, inner_map] : mymap) {
  for(auto const &[inner_key, inner_value] : inner_map) {
    // access your outer_key, inner_key and inner_value directly
  }
}

おすすめ記事