Пытаюсь использовать boost lambda, но мой код не скомпилируется - PullRequest
2 голосов
/ 15 апреля 2010

Я пытаюсь использовать форсированную лямбду, чтобы избежать необходимости писать тривиальные функторы. Например, я хочу использовать лямбду для доступа к члену структуры или вызова метода класса, например:

#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 ]

7 голосов
/ 15 апреля 2010

То, что вы хотите, является чем-то похожим на:

#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) );
4 голосов
/ 15 апреля 2010

Согласно это , я считаю, что синтаксис

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

Однако я хотел бы отметить (не так ли?) Очевидное - sort(vp.begin(), vp.end()); в основном будет делать то же самое. pair s по умолчанию сортируются по первому аргументу, а затем по второму. Поскольку вы используете sort (что не является стабильным), все пары будут отсортированы по first, а затем пары с равным first будут в более или менее случайном порядке.

Если вы хотите сохранить порядок, когда первые элементы равны, вы должны использовать stable_sort.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...