代码之家  ›  专栏  ›  技术社区  ›  Kirill V. Lyadvinsky

将值的矢量复制到一行中成对的矢量

  •  1
  • Kirill V. Lyadvinsky  · 技术社区  · 14 年前

    我有以下类型:

    struct X { int x; X( int val ) : x(val) {} };
    struct X2 { int x2; X2() : x2() {} };
    
    typedef std::pair<X, X2>      pair_t;
    typedef std::vector<pair_t>   pairs_vec_t;
    typedef std::vector<X>        X_vec_t;
    

    我需要初始化的实例 pairs_vec_t 值来自 X_vec_t . 我使用以下代码,它按预期工作:

    int main()
    {
      pairs_vec_t ps;
      X_vec_t xs; // this is not empty in the production code
    
      ps.reserve( xs.size() );
    
      { // I want to change this block to one line code.
        struct get_pair {
          pair_t operator()( const X& value ) { 
            return std::make_pair( value, X2() ); }
        };
        std::transform( xs.begin(), xs.end(), back_inserter(ps), get_pair() );
      }
    
      return 0;
    }
    

    我要做的是使用 boost::bind . 此代码不起作用:

    for_each( xs.begin(), xs.end(), boost::bind( &pairs_vec_t::push_back, ps, boost::bind( &std::make_pair, _1, X2() ) ) );
    

    我知道为什么它不起作用 但是我想知道如何使它在不声明额外的函数和结构的情况下工作?

    3 回复  |  直到 14 年前
        1
  •  5
  •   Anycorn    14 年前

    像这样?

    using boost::lambda;
    X2 x;
    transform(..., (bind(std::make_pair<X,X2>, _1, ref(x))));
    

    我现在不能检查,但如果从记忆中正确地回忆起,上述内容是有效的。

        2
  •  3
  •   kennytm    14 年前
    std::for_each( xs.begin(), xs.end(),
                   boost::bind( &pairs_vec_t::push_back, &ps,
    // you need to pass a pointer —— at least for gcc.   ^ 
                                boost::bind( &std::make_pair<X,X2>, _1, X2() ) ) );
    // you need to specify which make_pair to instantiate   ^^^^^^ 
    
        3
  •  0
  •   Potatoswatter    14 年前

    不需要提升。 std::bind2nd 正在被弃用以支持 std::bind 采用了Boost,但目前它是标准配置。

    pairs_vec_t ps( xs.size() );
    transform( xs.begin(), xs.end(), ps.begin(),
        bind2nd( ptr_fun( make_pair<X,X2> ), X2() ) );
    

    如果你 提高效率 insert 范围 transform_iterator )比重复 push_back 或预尺寸:

    pairs_vec_t ps(
        make_transform_iterator( xs.begin(), bind2nd( ptr_fun( make_pair<X,X2> ), X2() ) ),
        make_transform_iterator( xs.end(), bind2nd( ptr_fun( make_pair<X,X2> ), X2() ) ) );
    

    单程航班怎么样?