我有一个STL地图定义如下:
map<string, map<int, string> > info;
我使用以下代码迭代该地图:
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;
}
}
这是迭代的正确方法还是有更好的方法?上面的代码对我有用,但我正在寻找更优雅的解决方案。
答案 0 :(得分: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)
{
/* ... */
}
}
答案 1 :(得分:12)
如果C ++ 11可用,您可以使用范围for
循环:
for(auto &i: info) {
for(auto &j: i.second) {
/* */
}
}
如果只有C ++ 11 auto
可用:
for( auto i=info.begin(); i!=info.end(); ++i) {
for( auto j=i->second.begin(); j!=i->second.end(); ++j) {
/* */
}
}
如果您可以使用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 */
}
}
答案 2 :(得分:1)
虽然通过在地图中使用地图来解决您正在解决的问题尚不清楚,但我认为没有使用这些迭代器可以更好地迭代所有项目。要提高代码可读性,唯一可以做的就是在模板类型上使用typedef。
但是,将map
定义为
multimap <string, MyClass>
其中MyClass
被定义为一对整数和一个字符串,以及转储内容的toString()方法等?
答案 3 :(得分:1)
如果c ++ 11可用,我们可以使用stl算法for_each和lambda函数来获得优雅的解决方案
typedef map<int, string> INNERMAP;
typedef map<string, INNERMAP> OUTERMAP;
OUTERMAP theMapObject;
// populate the map object
//现在迭代地图对象
std::for_each(theMapObject.cbegin(), theMapObject.cend(),
[](const OUTERMAP::value_type& outerMapElement)
{
// process the outer map object
const INNERMAP& innerMapObject = outerMapElement.second;
std::for_each(innerMapObject.cbegin(), innerMapObject.cend(),
[](const INNERMAP::value_type& innermapElemen)
{
//process the inner map element
});
});
答案 4 :(得分:0)
如果你想遍历两个地图,那么你提出的方式是最好的方式。现在,如果您想要做某些特定事情,那么使用算法标题中的函数可能会更好。
答案 5 :(得分:0)
如果您有权使用C++11功能,那么range-based for loops中提出的Juraj Blaho's answer似乎是我最容易理解的选择。但是,如果您可以使用C++17,那么您可以将structured bindings与这些循环一起使用以进一步提高可读性,因为您可以摆脱所有first
和second
成员:
std::map<std::string, std::map<int, std::string>> info;
for (const auto &[k1, v1] : info) {
for (const auto &[k2, v2] : v1) {
std::cout << k1 << " : " << k2 << " : " << v2 << std::endl;
}
}