试图使用boost lambda,但我的代码不会编译

时间:2010-04-15 05:07:54

标签: c++ compiler-errors boost-lambda

我正在尝试使用boost lambda来避免编写琐碎的仿函数。 例如,我想使用lambda来访问结构的成员或调用类的方法,例如:

#include <vector>
#include <utility>
#include <algorithm>
#include <boost/lambda/lambda.hpp>

using namespace std;
using namespace boost::lambda;

vector< pair<int,int> > vp;

vp.push_back( make_pair<int,int>(1,1) );
vp.push_back( make_pair<int,int>(3,2) );
vp.push_back( make_pair<int,int>(2,3) );

sort(vp.begin(), vp.end(), _1.first > _2.first );

当我尝试编译时,我收到以下错误:

error C2039: 'first' : is not a member of 'boost::lambda::lambda_functor<T>'
        with
        [
            T=boost::lambda::placeholder<1>
        ]
error C2039: 'first' : is not a member of 'boost::lambda::lambda_functor<T>'
        with
        [
            T=boost::lambda::placeholder<2>
        ]

由于vp包含pair<int,int>,我认为_1.first应该有效。我做错了什么?

2 个答案:

答案 0 :(得分:7)

你想要的是类似于:

#include <boost/lambda/bind.hpp> // new header

// typedefs make code easier
typedef pair<int,int> pair_type;
typedef vector<pair_type> vector_type;

vector_type vp;

vp.push_back( make_pair(1,1) ); // don't specify template arguments!
vp.push_back( make_pair(3,2) ); // the entire point of make_pair is
vp.push_back( make_pair(2,3) ); // to deduce them.

sort(vp.begin(), vp.end(),
        bind(&pair_type::first, _1) > bind(&pair_type::first, _2) );

答案 1 :(得分:4)

根据this,我认为语法是

sort(vp.begin(), vp.end(), 
bind(&pair<int,int>::first, _1) > bind(&pair<int,int>::first, _2));

但是,我想指出(不是这样?)明显 - sort(vp.begin(), vp.end());基本上会做同样的事情。 pair默认情况下按其第一个参数排序,然后按第二个参数排序。由于您使用的是sort(不稳定),因此您将按first排序所有对,然后具有相等first的对将会在或多或少的随机顺序。

如果您想在第一个元素相等时保留订单,则应使用stable_sort代替。