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++;
hvintus answered 2020-07-07T09:06:32Z
21 votes

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

boost具有“范围适配器”的概念,可在迭代器范围上执行转换。 针对此确切用例,有特定的范围适配器(在映射键或值上迭代):boost::adaptors::map_valuesboost::adaptors::map_keys

因此,您可以像这样遍历地图值:

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

更多信息在这里。

Alex Goldberg answered 2020-07-07T09:07:05Z
4 votes

另一种选择是使用BOOST_FOREACH_PAIR,在这里查看我的答案:

BOOST_FOREACH和没有typedef的模板

dtw answered 2020-07-07T09:07:29Z
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
K.B answered 2020-07-07T09:07:50Z
translate from https://stackoverflow.com:/questions/795443/using-boost-foreach-with-stdmap