Показання в попередній частині різноманітні сортування - Гнучкий і красивий механізм на всі випадки життя. Ось тільки на практиці сортувати в чистому вигляді послідовності майже ніколи не доводиться. Це все з області навчально-показових завдань.
На практиці куди частіше стоїть завдання сортувати досить об'ємні структури даних (об'ємні навіть не за своїм розміром, а по числу своїх полів). І сортувати (або перевпорядковувати) їх має бути за значеннями самих різних полів цих самих структур. Але і тут на допомогу приходять 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)); } } |
Програма запитує номер поля дані, за яким вестиметься сортування (насправді - порівняння). Якщо цей номер вводиться, як позитивне число, то сортування по цьому полю йде в порядку зростання. Якщо ж номер вводиться зі знаком мінус - то порядок сортування змінюється на зворотний:
Зверніть увагу, що алгоритму сортування абсолютно байдуже що сортувати: якщо це числові дані, то за величиною, а якщо малі, то в лексографіческом порядку.
А зможете аналогічно розтлумачити функцію find(…)?
Намагався самостійно написати пошук по вектору для структури типу
по id-елементу (при тому елементів з однаковим id бути не може).
Пробував писав функтор типу
і посилати його з вже ініціалізірованим id (створював об'єкт функтора з параметрами і кидав вже його) - Нахапав купку помилок на кшталт “функції find(★ аргументи ★) не існує”.
Пробував аналогічно з лямбда - все те ж саме…
Підозрюю себе в географічно неправильному розташуванні рук
Можу розібратися і розтлумачити ;-).
Тільки це досить докладно, і тут редактор коментарів не дає змоги.
звертайтеся сюди: http://rus-linux.net/forum/viewforum.php?f=31