Сортировка по различным полям C++

160
11 января 2020, 06:10

Есть такой класс:

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;
        ...
        }
    });

Но не выходит, не совсем понимаю, как захватывать значение

Answer 1

Не пытайтесь запихнуть все в одну лямбду. Будет только запутывать.

Напишите несколько дружественных (для доступа к полям) функций сравнения по полям - типа,

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;

или как там вам нужно...

READ ALSO
Поиск по условию и вывод из вектора

Поиск по условию и вывод из вектора

Есть vector<string> words; со словами, взятыми из файла

195
Требуется спецификатор типа: вложенные классы. C++

Требуется спецификатор типа: вложенные классы. C++

При попытке инициализации члена класса, являющегося при этом объектом вложенного класса, возникает ошибкаВот код:

403
Spring gateway mapping к spring rest data

Spring gateway mapping к spring rest data

Создал Gateway сервис и сервис товаров, все конектится через eurekaвот зависимость для gateway

194