如何通过地图的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";
我怎样才能通过这个地图循环访问各种值?
旧的问题,但其余的答案是过时的C ++ 11 – 你可以使用基于范围的循环 ,只是做:
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 } }
这应该比以前的版本更清洁,并避免不必要的副本。
有些人赞成使用引用variables的明确定义来replace注释(如果未使用,则将其优化掉):
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; } }
你可以使用一个迭代器。
typedef std::map<std::string, std::map<std::string, std::string>>::iterator it_type; for(it_type iterator = m.begin(); iterator != m.end(); iterator++) { // iterator->first = key // iterator->second = value // Repeat if you also want to iterate through the second map. }
for(std::map<std::string, std::map<std::string, std::string> >::iterator outer_iter=map.begin(); outer_iter!=map.end(); ++outer_iter) { for(std::map<std::string, std::string>::iterator inner_iter=outer_iter->second.begin(); inner_iter!=outer_iter->second.end(); ++inner_iter) { std::cout << inner_iter->second << std::endl; } }
或更好的C ++ 0x:
for(auto outer_iter=map.begin(); outer_iter!=map.end(); ++outer_iter) { for(auto inner_iter=outer_iter->second.begin(); inner_iter!=outer_iter->second.end(); ++inner_iter) { std::cout << inner_iter->second << std::endl; } }
做这样的事情:
typedef std::map<std::string, std::string> InnerMap; typedef std::map<std::string, InnerMap> OuterMap; Outermap mm; ...//set the initial values for (OuterMap::iterator i = mm.begin(); i != mm.end(); ++i) { InnerMap &im = i->second; for (InnerMap::iterator ii = im.begin(); ii != im.end(); ++ii) { std::cout << "map[" << i->first << "][" << ii->first << "] =" << ii->second << '\n'; } }
在C ++ 17中,您将能够使用“结构化绑定”function,通过这种function,您可以使用单个元组/对来定义具有不同名称的多个variables。 例:
for (const auto& [name, description] : planet_descriptions) { std::cout << "Planet " << name << ":\n" << description << "\n\n"; }
原来的build议 (由jacksonBjarne Stroustrup,香草萨特和加布里埃尔多斯雷斯)很有趣的阅读(和build议的语法是更直观恕我直言); 还有一个标准的build议措辞是无聊的,但更接近实际的内容。
C ++ 11:
std::map< std::string, std::map<std::string, std::string> > m; m["name1"]["value1"] = "data1"; m["name1"]["value2"] = "data2"; m["name2"]["value1"] = "data1"; m["name2"]["value2"] = "data2"; m["name3"]["value1"] = "data1"; m["name3"]["value2"] = "data2"; for (auto i : m) for (auto j : i.second) cout << i.first.c_str() << ":" << j.first.c_str() << ":" << j.second.c_str() << endl;
输出:
name1:value1:data1 name1:value2:data2 name2:value1:data1 name2:value2:data2 name3:value1:data1 name3:value2:data2
当映射为常量时std::map< std::string, std::map<std::string, std::string> >::const_iterator
使用std::map< std::string, std::map<std::string, std::string> >::const_iterator
。