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
]
助言がありますか?
問題は、ペアの最初のメンバー(const)にあります。これを試して:
typedef std::map<int, int> map_t;
map_t mmap;
BOOST_FOREACH( map_t::value_type &i, mmap )
i.second++;
これは古いスレッドですが、より便利な解決策があります。
boostには、イテレーターの範囲で変換を実行する「範囲アダプター」の概念があります。この正確なユースケースには特定の範囲アダプターがあります(マップのキーまたは値の繰り返し):boost::adaptors::map_values
およびboost::adaptors::map_keys
。
したがって、次のようにマップ値を反復できます。
BOOST_FOREACH(int& size, mmap | boost::adaptors::map_values)
{
++size;
}
詳細 ここ 。
別のオプションはBOOST_FOREACH_PAIRを使用することです。ここで私の答えを参照してください:
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