代码之家  ›  专栏  ›  技术社区  ›  Jens Luedicke

如何使用std::for_each with boost::bimap?

  •  -1
  • Jens Luedicke  · 技术社区  · 15 年前

    我有一个boost::bimap,我想迭代所有位置 将给定侧的值添加到另一个与STL兼容的容器中。 我该怎么做?

    我的方法是将std::与boost::bind一起用于

    std::for_each(mybimap.left.begin(),
                  mybimap.left.end(),
                  boost::bind(&vector::push_back, &myvec,
                    boost::bind( ... )));
    
    3 回复  |  直到 12 年前
        1
  •  4
  •   Rüdiger Hanke shraddha hattimare    15 年前

    这应该有效:

      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 更合适的是,imho算法名称应该说明意图,这显然是这里的一个副本)。您也可以使用 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()));
    

    我倾向于 变换迭代器 如果可能的话,因为我不必重复一元函数名。

        2
  •  1
  •   Gustavo Muenz    15 年前

    从您发布的代码来看,您似乎希望将所有内容从boost::bimap复制到std::vector。

    试试这个:

              std::copy(mybimap.left.begin(),
                        mybimap.left.end(),
                        std::back_inserter(myvec));
    
        3
  •  0
  •   Steve Guidi    12 年前

    尝试 &vector<your_value_type>::push_back 相反。