您可以使用BOOST_FOREACH
。但是为了清晰起见,您需要使用typedef:
typedef std::map<std::string, std::pair<std::string, int> > inner_map;
typedef std::pair<bool, inner_map> map_entry;
BOOST_FOREACH(map_entry& p, items)
{
...
}
我更喜欢简单的typedef
和for循环。我把typedef
看作变量赋值一样:
typedef std::map<std::string, std::pair<std::string, int> > inner_map
typedef std::map<bool, inner_map>::iterator map_iterator
for (map_iterator i = items.begin()
{
...
}
这些typedef也可以是私有成员。这种编码风格更清晰,因为您一眼就可以看到涉及的类型。
或者,如果您准备编写一个函数对象,则可以使用普通的std :: for_each
。在标准C ++中,我不太喜欢这种方法,因为循环体不再是局部的(但在某些情况下,这可能是一个优势):
struct some_functor
{
template <typename K, typename V>
void operator()(std::pair<K, V>& item)
{
}
};
之后
std::for_each(items.begin(), items.end(), some_functor())
如果您升级到VS2010,您有以下几种选择:
auto
和
std::for_each
与lambda表达式(我更喜欢这个)。在C++0x中,从技术上讲,您还可以使用基于范围的for循环(在VS2010中不可用)。
总之,我的建议是:
class meaningful_data
{
typedef std::map<std::string, std::pair<std::string, int> > inner_map;
std::map<bool, inner_map> items;
public:
typedef std::pair<bool, inner_map> value_type;
typedef std::map<bool, inner_map>::iterator iterator;
typedef std::map<bool, inner_map>::const_iterator const_iterator;
iterator begin() { return items.begin(); }
const_iterator begin() const { return items.begin(); }
iterator end() { return items.end(); }
const_iterator end() const { return items.end(); }
};
然后像这样迭代:
for (meaningful_data::iterator i = d.begin(); i != d.end(); ++i)
{
...
}
或者
BOOST_FOREACH(meaningful_data::value_type& i, d)
{
...
}
你可能希望封装这样一个复杂类型,至少使用一些typedef(如果inner_map
类型应该是公共的,你不必强制使用完整的类)。
for(auto idx: items) {...}
。 - norcalli