sort(mMyClassVector.begin(), mMyClassVector.end(),
[](const MyClass & a, const MyClass & b)
{
return a.mProperty > b.mProperty;
});
Chciałbym użyć funkcji lambda do sortowania niestandardowych klas zamiast wiązania metody instancji. Jednak powyższy kod powoduje błąd:
błąd C2564: „const char *”: konwersja stylu funkcji na typ wbudowany może przyjąć tylko jeden argument
Działa dobrze z boost::bind(&MyApp::myMethod, this, _1, _2)
.
Odpowiedzi:
Rozumiem.
sort(mMyClassVector.begin(), mMyClassVector.end(), [](const MyClass & a, const MyClass & b) -> bool { return a.mProperty > b.mProperty; });
Założyłem, że dowie się, że operator> zwrócił wartość bool (zgodnie z dokumentacją). Ale najwyraźniej tak nie jest.
źródło
operator>
.a.mProperty>b.mProperty
, z pewnością zwróci wartość bool.operator<
, nieoperator>
?<
, dla standardowej kolejności rosnącej. Zredagowałem odpowiedź, aby wyjaśnić, że była to sortowanie malejące, ale najwyraźniej moja edycja nie była pomocna i została wyczyszczona!-> bool
część nie jest potrzebna.Za dużo kodu możesz użyć w ten sposób:
#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; }
Zastąp „vec” swoją klasą i to wszystko.
źródło
Czy problem może dotyczyć wiersza „a.mProperty> b.mProperty”? Otrzymałem następujący kod do działania:
#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; };
Wynik to:
before sort: 83, 86, 77, 15, 93, 35, 86, 92, 49, 21, after sort: 93, 92, 86, 86, 83, 77, 49, 35, 21, 15,
źródło