首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何遍历地图的C++地图?

如何遍历地图的C++地图?
EN

Stack Overflow用户
提问于 2011-01-31 03:13:24
回答 7查看 438.4K关注 0票数 298

如何在C++中遍历std::map?我的地图定义为:

代码语言:javascript
复制
std::map< std::string, std::map<std::string, std::string> >

例如,上面的容器保存的数据如下:

代码语言:javascript
复制
m["name1"]["value1"] = "data1";
m["name1"]["value2"] = "data2";
m["name2"]["value1"] = "data1";
m["name2"]["value2"] = "data2";
m["name3"]["value1"] = "data1";
m["name3"]["value2"] = "data2";

我如何遍历这个映射并访问不同的值?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-12-08 00:39:28

老问题,但剩下的答案在C++11中已经过时了-您可以使用ranged based for loop并简单地执行以下操作:

代码语言:javascript
复制
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
  }
}

这应该比以前的版本干净得多,并避免不必要的副本。

一些人倾向于用引用变量的显式定义来替换注释(如果不使用,这些变量会被优化掉):

代码语言:javascript
复制
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;
  }
}
票数 575
EN

Stack Overflow用户

发布于 2011-01-31 03:17:07

您可以使用迭代器。

代码语言:javascript
复制
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.
}
票数 309
EN

Stack Overflow用户

发布于 2011-01-31 03:19:30

代码语言:javascript
复制
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中更好:

代码语言:javascript
复制
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;
    }
}
票数 60
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4844886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档