Как отсортировать данные о студентах по фамилиям на C++?

У меня есть vector<string> students, который содержит данные о студентах: ФИО;курс;группа - так они записанны в виде строк. Задача - отсортировать этот vector по фамилим студентов. Все никак не могу понять как это правильно сделать, если создать отдельный вектор фамилий и сортировать его, то как связать с остальными данными, помогите пожвлуйста


Ответы (1 шт):

Автор решения: Koto SCrafter

Есть функция std::sort(_RanIt _first, _RanIt _last, _Pr pred) из стандартной библиотеки algorithm. Она принимает три значения: итератор начала сортируемого отрезка, итератор конца и предикат. Предикат - функция возвращающая bool значение. Она используется для сравнения двух элементов отрезка и выполнения сортировки. В данном случае предикат будет такого вида:

bool pred(string str1, string str2) {}

Но можно использовать лямбда выражение и получится:

[](string str1, string str2) {}

Внутри этой функции надо выкусить фамилии из строк и сравнить их. Можно использовать string::substr(size_t _off, size_t count) (где _off - индекс первого символа подстроки, а count - количество символов) и сравнить получившиеся строки, но я использую побуквенное сравнение так как у меня оно уже было написано:

sort(vec.begin(), vec.end(), [](string str1, string str2) {
        for (int i = 0; i < str1.find(' '); i++) {
            if (tolower(str1[i]) < tolower(str2[i])) return true;
            if (tolower(str1[i]) > tolower(str2[i])) return false;
        }
        if (str1.find(' ') < str2.find(' ')) return true;
        return false;
        });
→ Ссылка