2009-09-04 65 views
-1

我有一個boost :: bimap,我想遍歷所有位置 將給定端的值添加到另一個兼容STL的容器。 我該怎麼做?如何在boost :: bimap中使用std :: for_each?

我的方法是用的boost ::綁定在一起使用std :: for_each的:

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

它不工作,因爲...(把錯誤描述在這裏)? – liori 2009-09-04 15:01:48

回答

4

這應該工作:

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

編輯:我覺得這雙綁定相當笨拙,並且for_each非優化算法(copy會更適合,恕我直言算法名稱應說明意圖,並在這裏,顯然是一個副本)。你也可以使用這裏transform iterator

std::copy(boost::make_transform_iterator(mybimap.left.begin(), select_second()), 
      boost::make_transform_iterator(mybimap.left.end(), select_second()), 
      std::back_inserter(myvec)); 

其中select_second將是一個函數對象,選擇對的第二個元素 - 或者只是boost::bind(&map_type::left_map::value_type::second, _1)

對於一個情況,我無法用一個transform_iterator我已經寫在這基本上是一個back_inserter這需要被寫入之前應用於元素(沒有火箭科學寫)的一元函數工作transform_back_inserter - 那麼它看起來像

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

,我更願意到transform_iterator時儘可能我沒有重複一元函數的名稱。

1

從您發佈它看起來像要複製一切從boost :: bimap的一種性病的代碼來看: :向量。

試試這個:

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

這不起作用。我決定使用經典的for-loop來處理給定的元素。 – 2009-09-10 06:50:20

0

改爲嘗試&vector<your_value_type>::push_back

相關問題