使用BOOST_FOREACH与std :: map

我想使用BOOST_FOREACH遍历一个std :: map并编辑值。 我不太明白。

typedef std::pair<int, int> IdSizePair_t; std::map<int,int> mmap; mmap[1] = 1; mmap[2] = 2; mmap[3] = 3; BOOST_FOREACH( IdSizePair_t i, mmap ) i.second++; // mmap should contain {2,3,4} here 

当然,这不会改变任何东西,因为我不是通过引用迭代。 所以我用这行代替(按照Boost文档中的例子):

 BOOST_FOREACH( IdSizePair_t &i, mmap ) 

我得到的编译器错误:

 error C2440: 'initializing' : cannot convert from 'std::pair<_Ty1,_Ty2>' to 'IdSizePair_t &' with [ _Ty1=const int, _Ty2=int ] 

有什么build议么?

问题在于这个对的第一个成员,它应该是const 。 尝试这个:

 typedef std::map<int, int> map_t; map_t mmap; BOOST_FOREACH( map_t::value_type &i, mmap ) i.second++; 

这是一个古老的线程,但有一个更方便的解决scheme。

boost有一个“范围适配器”的概念,它对迭代器范围进行转换。 对于这个确切的用例,有特定的范围适配器(迭代映射键或值): boost::adaptors::map_valuesboost::adaptors::map_keys

所以你可以像这样迭代映射值:

 BOOST_FOREACH(int& size, mmap | boost::adaptors::map_values) { ++size; } 

更多信息在这里 。

另一个select是使用BOOST_FOREACH_PAIR,在这里看到我的答案:

BOOST_FOREACH和没有typedef的模板

从C ++ 11开始考虑使用auto关键字:

 std::map<int,int> mmap; mmap[1] = 1; mmap[2] = 2; mmap[3] = 3; BOOST_FOREACH(auto& mpair, mmap) mpair.second++; //mmap will contain {2,3,4} here