Показанные в предыдущей части разнообразные сортировки — гибкий и красивый механизм на все случаи жизни. Вот только на практике сортировать в чистом виде последовательности почти никогда не приходится. Это всё из области учебно-показательных задач.
На практике куда чаще стоит задача сортировать достаточно объёмные структуры данных (объёмные даже не по своему размеру, а по числу своих полей). И сортировать (или пересортировывать) их предстоит по значениям самых разных полей этих самых структур. Но и здесь на помощь приходят алгоритмы STL, особенно при использовании их совместно с функторами.
Посмотрим типовую модельную задачу, которую мы уже видели раньше — описание учебной группы или факультета:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; struct data { // запись о студенте string fio; int group, age, scholarship; inline friend ostream& operator <<(ostream& out, const struct data& obj) { return cout << "[ " << obj.fio << " : " << obj.group << " : " << obj.age << " : " << obj.scholarship << " ]"; } }; struct comp_data { // функтор сравнения int what; bool compare(const struct data& f, const struct data& s) { switch (abs(what)) { case 1: return f.fio < s.fio; case 2: return f.group < s.group; case 3: return f.age < s.age; case 4: return f.scholarship < s.scholarship; default: return false; } } public: comp_data(int what) : what(what) {} bool operator()(const struct data& f, const struct data& s) { bool ret = compare(f, s); return what >= 0 ? ret : !ret; } }; class faculty : public vector<struct data> { // журнал public: faculty(const vector<struct data>& ini) { for (auto &x : ini) this->push_back(x); } inline friend ostream& operator <<(ostream& out, const faculty& obj) { for (auto &x : obj) out << x << endl; return out; } }; int main(void) { setlocale(LC_ALL, "rus"); faculty filology = (vector< struct data >({ { "Сидоров С.С.", 12, 19, 1500 }, { "Иванов И.И.", 13, 20, 0 }, { "Петров П.П.", 11, 21, 0 }, { "Чапаев В.И.", 10, 45, 2000 }, })); while (true) { cout << filology; cout << "поле сортировки? : "; int mode; cin >> mode; if (!cin || (cin.rdstate() & ios::eofbit)) { cout << endl; break; } sort(filology.begin(), filology.end(), comp_data(mode)); } } |
Программа запрашивает номер поля data, по которому будет вестись сортировка (на самом деле — сравнение). Если этот номер вводится, как положительное число, то сортировка по этому полю идёт в порядке возрастания. Если же номер вводится со знаком минус — то порядок сортировки меняется на обратный:
Обратите внимание, что алгоритму сортировки совершенно безразлично что сортировать: если это числовые данные, то по величине, а если строчные, то в лексографическом порядке.
А сможете аналогично растолковать функцию find(…)?
Пытался самостоятельно написать поиск по вектору для структуры типа
по id-элементу (при том элементов с одинаковым id быть не может).
Пробовал писал функтор типа
и посылать его с уже инициализированым id (создавал объект функтора с параметрами и кидал уже его) — нахватал кучку ошибок вроде “функции find(★аргументы★) не существует”.
Пробовал аналогично с лямбдой — всё тоже самое…
Подозреваю себя в географически неправильном расположении рук
Могу разобраться и растолковать ;-).
Только это довольно обстоятельно, и здесь редактор комментариев не позволяет.
Обращайтесь сюда: http://rus-linux.net/forum/viewforum.php?f=31