Как мога да сортирам списък от класове по определена членска променлива?
class Klasse {
int _a;
int _b;
}
...
list<Klasse> liste;
liste.sort(); // sorts by _a
liste.sort(?); // how to sort by _b now?
Как мога да сортирам списък от класове по определена членска променлива?
class Klasse {
int _a;
int _b;
}
...
list<Klasse> liste;
liste.sort(); // sorts by _a
liste.sort(?); // how to sort by _b now?
Ще използвате обект за сравнение. Ето пример с използване на ламбда.
std::list<Klasse> liste;
liste.sort([](Klasse const & lhs, Klasse const & rhs) {
return lhs._b < rhs._b;
});
Можете да напишете функция за сравнение - общо взето всичко, което може да бъде извикано с два аргумента от типа елемент на вашия списък, и това извикване връща стойност, конвертируема в bool
. Такова "всичко" може да бъде ламбда, функционален обект или просто просто функция:
bool klasse_sort_by_b(const Klasse& l, const Klasse& r)
{
return l._b < r._b;
}
liste.sort(klasse_sort_by_b);
имате нужда от тази реализация от сорта:
template<typename Compare>
void sort (Compare comp);
след това преминете вътре в функция за сравнение като:
bool compareByA( const Klasse& first, const Klasse& second ){
return first._a < second._a;
}
тогава го наречете:
std::list<Klasse> lst;
...
lst.sort(compareByA);
lst.sort(compareByB);
http://www.cplusplus.com/reference/list/list/sort/
Трябва да напишете свой собствен инструмент за сравнение, пример и употреба във връзката ;)
ето обещания примерен код
(благодаря за градивната критика)
bool compare_by_b (const Klasse& first, const Klasse& second)
{
return first._b < second._b ;
}
liste.sort(compare_by_b);
Да, и всичко, което трябва да направите, е да внедрите клас за сравнение или да претоварите операторите за сравнение Klasse::operator<
. За справка относно метода sort
вижте това.