C++ list::сортировка классов по членам

Как отсортировать список классов по определенной переменной-члену?

class Klasse {
  int _a;
  int _b;

}

...
list<Klasse> liste;
liste.sort();   // sorts by _a
liste.sort(?);  // how to sort by _b now?

person LPrc    schedule 14.01.2015    source источник
comment
Пробовали ли вы создать собственный компаратор?   -  person tadman    schedule 14.01.2015


Ответы (5)


Вы должны использовать объект сравнения. Вот пример использования лямбды.

std::list<Klasse> liste;
liste.sort([](Klasse const & lhs, Klasse const & rhs) {
    return lhs._b < rhs._b;
});
person Bill Lynch    schedule 14.01.2015
comment
С++ 11 или новее? Эти вещи хороши, если ваш компилятор их поддерживает. - person tadman; 14.01.2015
comment
это довольно C + 11 :) приятно! - person Marcus Müller; 14.01.2015
comment
Кстати, лямбда - это не то, что легко поймет кто-то, кто плохо знаком с С++, поэтому это может быть не лучший ответ без дополнительных ссылок. - person Marcus Müller; 14.01.2015

См. ссылку.

Вы можете написать функцию сравнения - в основном все, что можно вызвать с двумя аргументами типа элемента вашего списка, и этот вызов возвращает значение, конвертируемое в bool. Таким «чем угодно» может быть лямбда, объект функции или просто функция:

bool klasse_sort_by_b(const Klasse& l, const Klasse& r)
{
    return l._b < r._b;
}

liste.sort(klasse_sort_by_b);
person milleniumbug    schedule 14.01.2015

вам нужна эта реализация вида:

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);
person AlexTheo    schedule 14.01.2015


Да, и все, что вам нужно сделать, это реализовать класс компаратора или перегрузить операторы сравнения Klasse::operator<. Справку по методу sort см. в этом.

person Marcus Müller    schedule 14.01.2015