C ++-将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
]
有什么建议?
kmote asked 2020-07-07T09:06:17Z
4个解决方案
68 votes
问题出在这对的第一个成员上,应该是const。 试试这个:
typedef std::map<int, int> map_t;
map_t mmap;
BOOST_FOREACH( map_t::value_type &i, mmap )
i.second++;
21 votes
这是一个旧线程,但是有一个更方便的解决方案。
boost具有“范围适配器”的概念,可在迭代器范围上执行转换。 针对此确切用例,有特定的范围适配器(在映射键或值上迭代):boost::adaptors::map_values
和boost::adaptors::map_keys
。
因此,您可以像这样遍历地图值:
BOOST_FOREACH(int& size, mmap | boost::adaptors::map_values)
{
++size;
}
更多信息在这里。
4 votes
另一种选择是使用BOOST_FOREACH_PAIR,在这里查看我的答案:
BOOST_FOREACH和没有typedef的模板
0 votes
从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