Comment sortinger avec un lambda?

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

J’aimerais utiliser une fonction lambda pour sortinger les classes personnalisées au lieu de lier une méthode d’instance. Cependant, le code ci-dessus génère l’erreur:

erreur C2564: ‘const char *’: une conversion de style fonction en un type intégré ne peut prendre qu’un seul argument

Cela fonctionne très bien avec boost::bind(&MyApp::myMethod, this, _1, _2) .

Je l’ai.

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

J’ai supposé que le> opérateur retournait un bool (par documentation). Mais apparemment, ce n’est pas le cas.

Pour beaucoup de code, vous pouvez l’utiliser comme ceci:

 #include #include int main() { std::array 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; } 

Remplacez "vec" par votre classe et c'est tout.

Le problème peut-il être lié à la ligne “a.mProperty> b.mProperty”? J’ai eu le code suivant pour travailler:

 #include  #include  #include  #include  #include  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 VectorT; std::ssortingng toSsortingng(const VectorT& v) { std::ssortingngstream ss; std::copy(v.begin(), v.end(), std::ostream_iterator(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; }; 

La sortie est la suivante:

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