我有以下类型:
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() ) ) );
我知道它为什么不起作用,但我想知道如何在不声明额外功能和结构的情况下使其工作?
答案 0 :(得分:5)
这样的事情?
using boost::lambda;
X2 x;
transform(..., (bind(std::make_pair<X,X2>, _1, ref(x))));
我暂时无法检查,但如果从内存中正确调用,则上述内容有效。
答案 1 :(得分:3)
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 ^^^^^^
答案 2 :(得分:0)
不需要提升。 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() ) ) );
单人班轮怎么样?