如何在boost :: bimap中使用std :: for_each?

时间:2009-09-04 14:53:33

标签: c++ boost

我有一个提升:: bimap,我想迭代所有位置 将给定边的值添加到另一个STL兼容容器中。 我怎么能这样做?

我的方法是将std :: for_each与boost :: bind:

一起使用
std::for_each(mybimap.left.begin(),
              mybimap.left.end(),
              boost::bind(&vector::push_back, &myvec,
                boost::bind( ... )));

3 个答案:

答案 0 :(得分: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的情况,我在工作中写了一个transform_back_inserter,基本上是一个back_inserter,它采用了一个应用于该元素的一元函数写作(没有火箭科学写) - 然后它看起来像

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

我倾向于选择transform_iterator,因为我不必重复一元函数名称。

答案 1 :(得分:1)

根据您发布的代码判断,您希望将所有内容从boost :: bimap复制到std :: vector。

试试这个:

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

答案 2 :(得分:0)

请尝试&vector<your_value_type>::push_back