functional expresiones examples cppreference cplusplus c++ sorting lambda char const

expresiones - std c++



¿Cómo ordenar con un lambda? (3)

¿Puede ser el problema con la línea "a.mProperty> b.mProperty"? He obtenido el siguiente código para trabajar:

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

El resultado es:

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

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

Me gustaría utilizar una función lambda para ordenar clases personalizadas en lugar de vincular un método de instancia. Sin embargo, el código anterior produce el error:

error C2564: ''const char *'': una conversión de estilo de función a un tipo incorporado solo puede tomar un argumento

Funciona bien con boost::bind(&MyApp::myMethod, this, _1, _2) .


Lo tengo.

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

Supuse que se daría cuenta de que el operador> devolvió un bool (por documentación). Pero aparentemente no es así.


Para muchos códigos, puedes usarlo así:

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

Reemplaza "vec" con tu clase y eso es todo.