STL地图在地图C++中

Pra*_*van 11 c++ iteration dictionary stl

在c ++ STL map中,我有一个类似的定义

map<string, map<int, string> > info;
Run Code Online (Sandbox Code Playgroud)

我使用以下代码迭代它.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我怀疑这是迭代的正确方法还是有更好的方法呢?上面的代码适合我.但我正在寻找更优雅的解决方案.

ice*_*ime 16

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

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)
    {
        /* ... */
    }
}
Run Code Online (Sandbox Code Playgroud)


Jur*_*aho 12

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

for(auto &i: info) {
    for(auto &j: i.second) {
        /* */
    }
}
Run Code Online (Sandbox Code Playgroud)

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

for( auto i=info.begin(); i!=info.end(); ++i) {
   for( auto j=i->second.begin(); j!=i->second.end(); ++j) {
       /* */
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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 */
    }
}
Run Code Online (Sandbox Code Playgroud)