将BOOST_FOREACH与std :: map一起使用

时间:2009-04-27 21:55:43

标签: c++ boost foreach maps 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

当然这并没有改变任何东西,因为我没有通过引用迭代。所以我改为替换这一行(根据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 个答案:

答案 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_valuesboost::adaptors::map_keys

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

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

更多信息here

答案 2 :(得分:4)

另一种选择是使用BOOST_FOREACH_PAIR,请参阅我的回答:

BOOST_FOREACH & templates without typedef

答案 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