ল্যাম্বডা দিয়ে বাছাই কিভাবে?


136
sort(mMyClassVector.begin(), mMyClassVector.end(), 
    [](const MyClass & a, const MyClass & b)
{ 
    return a.mProperty > b.mProperty; 
});

আমি একটি উদাহরণ পদ্ধতির বাইন্ডিংয়ের জায়গায় কাস্টম ক্লাসগুলি সাজানোর জন্য ল্যাম্বডা ফাংশনটি ব্যবহার করতে চাই। তবে উপরের কোডটি ত্রুটিটি দেয়:

ত্রুটি C2564: 'কনস্ট চর *': একটি অন্তর্নির্মিত ধরণের ফাংশন-স্টাইল রূপান্তর কেবল একটি যুক্তি নিতে পারে

এটি দিয়ে ভাল কাজ করে boost::bind(&MyApp::myMethod, this, _1, _2)


ভেক্টর একটি কাঠামোর যা একটি পূর্ণসংখ্যা এবং দুটি স্ট্রিং রয়েছে। এখানে সম্পত্তি একটি পূর্ণসংখ্যা হবে।
বিটিআর

4
আমাদের একটি ছোট্ট সংকলনযোগ্য উদাহরণ দেখান ।
GManNickG

উত্তর:


157

বুঝেছি.

sort(mMyClassVector.begin(), mMyClassVector.end(), 
    [](const MyClass & a, const MyClass & b) -> bool
{ 
    return a.mProperty > b.mProperty; 
});

আমি ধরে নিয়েছি এটি অনুমান করে নিতে হবে যে> অপারেটর একটি বিল ফিরিয়ে দিয়েছে (প্রতিটি ডকুমেন্টেশন)। তবে আপাতদৃষ্টিতে তা হয় না।


39
তখন কি কৃপণতা operator>
GManNGG

2
আপনি এতক্ষণ যা লিখেছেন তা সামান্যই বোধগম্য হয়। এমপ্রোপার্টিটি যদি কোনও অন্তর্নিহিত হিসাবে অনুমিত হয় তবে অবশ্যই একটি বুল a.mProperty>b.mPropertyদেবে।
সেলিবিটজে

1
তাহলে আপনি আমার বিভ্রান্তি বুঝতে পারেন। আমি মনে করি এটি আমার ভিসি 10 এক্সপ্রেসের (কোনও সার্ভিস প্যাক নয়) অদ্ভুত কিছু হতে পারে। আমি প্রকল্পটি ভিজুয়াল স্টুডিও 2010 টিম সহ একটি মেশিনে স্থানান্তরিত করেছি এবং এটি "-> বুল" ছাড়াই কাজ করেছে worked
বিটিআর

8
এটা হওয়া উচিত operator<, না operator>?
ওয়ার্পস্পেস

8
হ্যাঁ এটি <স্ট্যান্ডার্ড আরোহী ক্রমের জন্য হওয়া উচিত । আমি উত্তরটি সম্পাদনা করেছিলাম এটি পরিষ্কার করার জন্য যে এটি একটি উতরিত বাছাই ছিল তবে দৃশ্যত আমার সম্পাদনাটি অসফল ছিল এবং মুছে গেল!
প্যানকেক

18

অনেক কোডের জন্য আপনি এটি এটি ব্যবহার করতে পারেন:

#include<array>
#include<functional>

int main()
{
    std::array<int, 10> vec = { 1,2,3,4,5,6,7,8,9 };

    std::sort(std::begin(vec), 
              std::end(vec), 
              [](int a, int b) {return a > b; });

    for (auto item : vec)
      std::cout << item << " ";

    return 0;
}

আপনার শ্রেণীর সাথে "ভেক" প্রতিস্থাপন করুন এবং এটিই।


আপনার উত্তর বিটিআর থেকে কীভাবে আলাদা? BTW। আপনি আরও সি ​​++ 11 তৈরি করতে std :: start (vec) এবং std :: end (vec) ব্যবহার করতে পারেন।
লগম্যান

দুঃখিত, আমি জানি না যে আমি কীভাবে এটি মিস করেছি। আমার চোখ স্টেফান পোস্টে থামছে। আমার খারাপ (আমি আপনার পরামর্শ পর পোস্ট সংশোধন)।
আদ্রিয়ান

5

সমস্যা কি "a.mProperty> b.mProperty" লাইনের সাথে থাকতে পারে? আমি কাজ করতে নিম্নলিখিত কোড পেয়েছি:

#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream>
#include <sstream>

struct Foo
{
    Foo() : _i(0) {};

    int _i;

    friend std::ostream& operator<<(std::ostream& os, const Foo& f)
    {
        os << f._i;
        return os;
    };
};

typedef std::vector<Foo> VectorT;

std::string toString(const VectorT& v)
{
    std::stringstream ss;
    std::copy(v.begin(), v.end(), std::ostream_iterator<Foo>(ss, ", "));
    return ss.str();
};

int main()
{

    VectorT v(10);
    std::for_each(v.begin(), v.end(),
            [](Foo& f)
            {
                f._i = rand() % 100;
            });

    std::cout << "before sort: " << toString(v) << "\n";

    sort(v.begin(), v.end(),
            [](const Foo& a, const Foo& b)
            {
                return a._i > b._i;
            });

    std::cout << "after sort:  " << toString(v) << "\n";
    return 1;
};

আউটপুটটি হ'ল:

before sort: 83, 86, 77, 15, 93, 35, 86, 92, 49, 21,
after sort:  93, 92, 86, 86, 83, 77, 49, 35, 21, 15,

হ্যাঁ, আমি যে সেটআপটি চালু করছিলাম তা নিয়ে কিছু ভুল। আমার ল্যাপটপটি ভিজ্যুয়াল স্টুডিও ২০১০ এর টিম সংস্করণে ঠিক না করে সংকলন করা হয়েছে I'd আমি কী আবদ্ধ করে রেখেছিলাম যে আমি আবার বাঁধতে চলেছি এবং ত্রুটিটি মুছে যাবে না। আমি ভিসি 10 এক্সপ্রেসে ছিলাম। বাগ?
বিটিআর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.