2

自明なファンクターを作成する必要がないように、ブースト ラムダを使用しようとしています。たとえば、ラムダを使用して構造体のメンバーにアクセスしたり、クラスのメソッドを呼び出したりしたいとします。

#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 が機能するはずだと思いました。私が間違っていることは何ですか?

4

2 に答える 2

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) );
于 2010-04-15T05:24:42.267 に答える
4

これによると、構文は

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

しかし、私は(そうではないのですか?)明らかなことを指摘したいと思います-sort(vp.begin(), vp.end());基本的に同じことをします。pairsはデフォルトで最初の引数でソートされ、次に2番目の引数でソートされます。を使用しているのでsort(これは安定していません)、すべてのペアをでソートしfirst、等しいペアはfirst多かれ少なかれランダムな順序になります。

最初の要素が等しいときに順序を保持したい場合は、stable_sort代わりにを使用する必要があります。

于 2010-04-15T05:25:08.060 に答える