محاولة استخدام Boost Lambda ، لكن الكود الخاص بي لن يتم تجميعه

StackOverflow https://stackoverflow.com/questions/2642868

سؤال

أحاول استخدام 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 يجب أن تعمل. ما أقوم به خطأ؟

هل كانت مفيدة؟

المحلول

ما تريده هو شيء أقرب إلى:

#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) );

نصائح أخرى

بالنسبة الى هذه, ، أعتقد أن بناء الجملة

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 في حين أن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top