Есть такой класс:
class Abiturient
{
private:
string fullName;
string birthDate;
string score;
string schoolName;
string course;
};
Нужно реализовать сортировку по различным полям, поле выбирает пользователь. Мой код:
void Abiturient::sort(vector<Abiturient> &arr, int selection, bool descending)
{
for (int n = 0; n < arr.size(); n++)
{
for (int i = 0; i < arr.size() - 1; i++)
{
switch (selection)
{
case 1:
if (trimSpace(stringToLower(arr[i].fullName)) > trimSpace(stringToLower(arr[i + 1].fullName)))
{
swapElements(arr[i], arr[i + 1]);
}
break;
case 2:
...
Топорно, конечно, прошу строго не судить, только учусь. Как можно сделать сортировку лучше? И желательно через функцию sort библиотеки algorithm. Пытался с помощью лямбды сделать подобие анонимной функции так:
sort(arr.begin(), arr.end(), [=selection](Abiturient first, Abiturient second) {
switch (selection) {
case 1:
return first.fullName < second.fullName;
case 2:
return first.birthDate < second.birthDate;
...
}
});
Но не выходит, не совсем понимаю, как захватывать значение
Не пытайтесь запихнуть все в одну лямбду. Будет только запутывать.
Напишите несколько дружественных (для доступа к полям) функций сравнения по полям - типа,
bool lessByName(const Abiturient& a, const Abiturient& b)
{
return a.fullName < b.fullName;
}
bool lessByScore(const Abiturient& a, const Abiturient& b)
{
return a.score < b.score;
}
А там и сортируйте, как надо
switch (selection) {
case 1:
sort(array.begin(),array.end(),lessByName);
break;
case 2:
sort(array.begin(),array.end(),lessByScore);
break;
или как там вам нужно...
Продвижение своими сайтами как стратегия роста и независимости