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_valuesおよびboost::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 に答える