2009-09-04 11 views
-1

私はboost :: bimapを持っていて、指定された側の値を別のSTL互換コンテナに追加するには、すべての位置を反復します。 どうすればいいですか?boost :: bimapでstd :: for_eachを使うにはどうすればいいですか?

std::for_each(mybimap.left.begin(), 
       mybimap.left.end(), 
       boost::bind(&vector::push_back, &myvec, 
       boost::bind(...))); 
+4

...(エラー記述をここに入れる)ために動作しませんか? – liori

答えて

4

これは動作するはずです。

EDIT:私はこのダブルバインドはむしろ不器用見つけ、そしてfor_each非最適アルゴリズム(アルゴリズム名は意図を述べるべきで、それは明らかにここにコピーだ私見copyは、より適しだろう)。あなたもここでtransform iteratorを使用することができます。

select_secondは、ペアの2番目の要素を選択する関数オブジェクトになり
std::copy(boost::make_transform_iterator(mybimap.left.begin(), select_second()), 
      boost::make_transform_iterator(mybimap.left.end(), select_second()), 
      std::back_inserter(myvec)); 

- またはちょうどboost::bind(&map_type::left_map::value_type::second, _1)を。私は基本的に(書き込みに何もロケット科学を)書いていないの前に要素に適用される単項関数を受け取りback_inserterある仕事でtransform_back_inserterを書かれているtransform_iteratorを使用することができなかった状況では

- それは私は単項関数名を繰り返す必要はありませんよう、可能な場合transform_iteratorに好む傾向にある

std::copy(mybimap.left.begin(), 
      mybimap.left.end(), 
      transform_back_inserter(myvec, select_second())); 

ようになります。

1

あなたはそれはあなたがブースト:: 2領域マップSTDに至るまでをコピーするようになります投稿コードから判断:

私のアプローチは、ブースト::バインドと一緒のstd :: for_eachを使用していました。 :ベクター。

これを試してみてください:

std::for_each(mybimap.left.begin(), 
       mybimap.left.end(), 
       boost::bind(&vector_type::push_back, &myvec, 
        boost::bind(&map_type::left_map::value_type::second, _1))); 

を...または、あなたが代わりにマップされる値のからマッピングされたキー値を意味している場合、first代わりのsecondを使用します。

  std::copy(mybimap.left.begin(), 
        mybimap.left.end(), 
        std::back_inserter(myvec)); 
+0

これは機能しません。私は、古典的なfor-loopを使用して、指定された要素に介入することにしました。 –

0

代わりに&vector<your_value_type>::push_backを試してください。

関連する問題