代码之家  ›  专栏  ›  技术社区  ›  kmote Funkpotamus

在std::map中使用boost foreach

  •  44
  • kmote Funkpotamus  · 技术社区  · 15 年前

    我想使用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 docs中的示例):

    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 回复  |  直到 9 年前
        1
  •  68
  •   hvintus    15 年前

    问题出在对的第一个成员身上,应该是 康斯特 . 试试这个:

    typedef std::map<int, int> map_t;
    map_t mmap;  
    BOOST_FOREACH( map_t::value_type &i, mmap )
        i.second++;
    
        2
  •  21
  •   Alex Goldberg    12 年前

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

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

    所以您可以像这样迭代映射值:

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

    更多信息 here .

        3
  •  4
  •   Community uzul    7 年前

    另一种选择是使用Boost-ForEach对,请看我的答案:

    BOOST_FOREACH & templates without typedef

        4
  •  0
  •   K.B    9 年前

    在C++ 11中考虑使用自动关键字:

    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