【问题标题】:Copy vector of values to vector of pairs in one line将值向量复制到一行中的对向量
【发布时间】:2010-04-28 19:54:34
【问题描述】:

我有以下几种:

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;

我需要用来自X_vec_t 的值初始化pairs_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() ) ) );

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

【问题讨论】:

  • 不!这不是 Perl!我更喜欢可读的版本:)
  • 如果最终结果看起来不可读,我不会在生产代码中使用bind。老实说:)

标签: c++ boost boost-bind stl


【解决方案1】:

这样的?

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

我现在无法检查,但如果从记忆中正确回忆,以上是有效的。

【讨论】:

  • 谢谢,完全忘了make_pair是一个模板函数。
【解决方案2】:
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   ^^^^^^ 

【讨论】:

  • 谢谢,完全忘了make_pair是一个模板函数。
【解决方案3】:

不需要升压。 std::bind2nd 已被弃用,取而代之的是 Boost 采用的 std::bind,但目前它是标准。

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

如果您确实有 Boost,那么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() ) ) );

单线怎么样?

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2016-07-08
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多