首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在STL映射中遍历STL映射?

如何在STL映射中遍历STL映射?
EN

Stack Overflow用户
提问于 2010-12-23 14:50:06
回答 6查看 20.3K关注 0票数 11

我有一个如下的STL映射定义:

代码语言:javascript
复制
map<string, map<int, string> > info;

我使用以下代码迭代该映射:

代码语言:javascript
复制
for( map<string, map<int, string> >::iterator ii=info.begin(); ii!=info.end(); ++ii){
    for(map<int, string>::iterator j=ii->second.begin(); j!=ii->second.end();++j){
        cout << (*ii).first << " : " << (*j).first << " : "<< (*j).second << endl;
    }
}

这是正确的迭代方式,还是有更好的方式呢?上面的代码适用于我,但我正在寻找一种更优雅的解决方案。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-12-23 14:54:28

这是正确的,它只是缺少一些typedef和可读性改进:

代码语言:javascript
复制
typedef std::map<int, std::string> inner_map;
typedef std::map<std::string, inner_map> outer_map;

for (outer_map::iterator i = outerMap.begin(), iend = outerMap.end(); i != iend; ++i)
{
    inner_map &innerMap = i->second;
    for (inner_map::iterator j = innerMap.begin(), jend = innerMap.end(); j != jend; ++j)
    {
        /* ... */
    }
}
票数 16
EN

Stack Overflow用户

发布于 2010-12-23 15:29:05

如果C++11可用,您可以使用range for循环:

代码语言:javascript
复制
for(auto &i: info) {
    for(auto &j: i.second) {
        /* */
    }
}

如果只有C++11 auto可用:

代码语言:javascript
复制
for( auto i=info.begin(); i!=info.end(); ++i) {
   for( auto j=i->second.begin(); j!=i->second.end(); ++j) {
       /* */
   }
}

如果您可以使用BOOST,则可以使用BOOST_FOREACH:

代码语言:javascript
复制
typedef std::map<int, std::string> inner_map;
typedef std::map<std::string, inner_map> outer_map;

outer_map outer;

BOOST_FOREACH(outer_map::value_type &outer_value, outer){
    BOOST_FOREACH(inner_map::value_type &inner_value, outer_value->second){
        /* use outer_value and inner_value as std::pair */
    }
}
票数 12
EN

Stack Overflow用户

发布于 2010-12-23 14:55:54

虽然还不清楚在map中使用map可以解决什么问题,但我认为没有更好的方法在不使用这些迭代器的情况下对所有项进行迭代。提高代码可读性的唯一方法是在模板类型上使用typedefs。

但是,将您的map定义为

multimap <string, MyClass>

其中MyClass被定义为一对整数和一个字符串,以及一个用于转储内容的toString()方法,等等?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4516495

复制
相关文章

相似问题

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