将BOOST_FOREACH与std :: map一起使用

kmo*_*ote 45 c++ foreach maps boost std

我想使用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
Run Code Online (Sandbox Code Playgroud)

当然,这并没有改变任何东西,因为我没有通过引用迭代.所以我替换了这一行(根据Boost文档中的示例):

BOOST_FOREACH( IdSizePair_t &i, mmap )
Run Code Online (Sandbox Code Playgroud)

我得到编译器错误:

error C2440: 'initializing' : 
cannot convert from 'std::pair<_Ty1,_Ty2>' to 'IdSizePair_t &'
    with
    [
        _Ty1=const int,
        _Ty2=int
    ]
Run Code Online (Sandbox Code Playgroud)

有什么建议?

hvi*_*tus 68

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

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


Ale*_*erg 21

这是一个旧线程,但有一个更方便的解决方案.

boost具有"范围适配器"的概念,它在迭代器范围上执行转换.对于这个确切的用例,有特定的范围适配器(迭代映射键或值):boost::adaptors::map_valuesboost::adaptors::map_keys.

所以你可以迭代这样的地图值:

BOOST_FOREACH(int& size, mmap | boost::adaptors::map_values)
{ 
    ++size;
}
Run Code Online (Sandbox Code Playgroud)

更多信息在这里.