45

我想使用 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
    ]

有什么建议么?

4

4 回答 4

69

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

typedef std::map<int, int> map_t;
map_t mmap;  
BOOST_FOREACH( map_t::value_type &i, mmap )
    i.second++;
于 2009-04-27T22:09:54.647 回答
21

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

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

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

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

更多信息在这里

于 2012-10-04T21:41:55.107 回答
4

另一种选择是使用 BOOST_FOREACH_PAIR,请在此处查看我的答案:

BOOST_FOREACH 和没有 typedef 的模板

于 2010-08-04T05:23:22.490 回答
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
于 2015-08-17T18:44:42.023 回答