2009-09-04 61 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

相关问题