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

Как мога да сортирам списък от класове по определена членска променлива?

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
C++11 или по-късно? Тези неща са страхотни, ако вашият компилатор ги поддържа. - person tadman; 14.01.2015
comment
това е доста C+11 :) хубаво! - person Marcus Müller; 14.01.2015
comment
Между другото, ламбда не е нещо, което някой нов в C++ ще разбере лесно, така че това може да не е най-добрият отговор без допълнителни препратки. - 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

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);
person Zongor Lajos    schedule 14.01.2015
comment
Трябва да включите код в отговора си, вместо да препращате към външни ресурси. - person Overv; 14.01.2015
comment
той отговаря на въпроса (макар и кратко) и дава справка. Вероятно не е най-задълбоченото обяснение, но си струва повече от гласуване против! - person Marcus Müller; 14.01.2015
comment
@MarcusMüller: meta.stackexchange.com/questions/8231/ - person Bill Lynch; 14.01.2015
comment
Съгласен съм, но той не просто направи връзка някъде. Той каза, че напишете компаратор, което е абсолютно вярно и дори може да е достатъчно, за да даде старт на OP, ако свързаният сайт падне в един момент. - person Marcus Müller; 14.01.2015

Да, и всичко, което трябва да направите, е да внедрите клас за сравнение или да претоварите операторите за сравнение Klasse::operator<. За справка относно метода sort вижте това.

person Marcus Müller    schedule 14.01.2015