我想使用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
]
有什么建议吗?
答案 0 :(得分:68)
问题在于该对的第一个成员,它应该是 const 。试试这个:
typedef std::map<int, int> map_t;
map_t mmap;
BOOST_FOREACH( map_t::value_type &i, mmap )
i.second++;
答案 1 :(得分:21)
这是一个旧线程,但有一个更方便的解决方案。
boost具有“范围适配器”的概念,它在迭代器范围上执行转换。这个确切的用例有特定的范围适配器(迭代地图键或值):boost::adaptors::map_values
和boost::adaptors::map_keys
。
所以你可以像这样迭代地图值:
BOOST_FOREACH(int& size, mmap | boost::adaptors::map_values)
{
++size;
}
更多信息here。
答案 2 :(得分:4)
另一种选择是使用BOOST_FOREACH_PAIR,请参阅我的回答:
答案 3 :(得分:0)
从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