Крім контейнерів і ітераторів, бібліотека STL також надає ряд універсальних алгоритмів для роботи з елементами контейнерів. Вони дозволяють виконувати такі операції, як пошук, сортування, вставка, зміна позиції, видалення і копіювання елементів контейнера.
Алгоритми STL
Алгоритми STL реалізовані у вигляді глобальних функцій, які працюють з використанням ітераторів. Це означає, що кожен алгоритм потрібно реалізувати всього лише один раз, і він працюватиме з усіма контейнерами, які надають набір ітераторів (включаючи і ваші власні (користувацькі) контейнерні класи). Хоча це має величезний потенціал і надає можливість швидко писати складний код, у алгоритмів також є і “темна сторона” — деяка комбінація алгоритмів і типів контейнерів може не працювати/працювати з поганою продуктивністю/викликати нескінченні цикли, тому слід бути обережним.
Бібліотека STL надає досить багато алгоритмів. На цьому уроці ми розглянемо лише деякі з найбільш поширених і простих у використанні алгоритмів. Для їх роботи потрібно підключити заголовок algorithm.
Алгоритми min_element() і max_element()
Алгоритми min_element() і max_element() знаходять мінімальний і максимальний елементи в контейнері:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <list> #include <algorithm> int main() { std::list<int> li; for (int nCount=0; nCount < 5; ++nCount) li.push_back(nCount); std::list<int>::const_iterator it; // оголошуємо ітератор it = min_element(li.begin(), li.end()); std::cout << *it << ' '; it = max_element(li.begin(), li.end()); std::cout << *it << ' '; std::cout << '\n'; } |
Результат виконання програми:
Алгоритми find() і list::insert()
У наступному прикладі ми використаємо алгоритм find(), щоб знайти певне значення в списку, а потім використаємо функцію list::insert() для додання нового значення в список:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <list> #include <algorithm> int main() { std::list<int> li; for (int nCount=0; nCount < 5; ++nCount) li.push_back(nCount); std::list<int>::iterator it; // оголошуємо ітератор it = find(li.begin(), li.end(), 2); // шукаємо в списку число 2 li.insert(it, 7); // використовуємо алгоритм list::insert() для додання числа 7 перед числом 2 for (it = li.begin(); it != li.end(); ++it) // виводимо за допомогою циклу і ітератора елементи списку std::cout << *it << ' '; std::cout << '\n'; } |
Результат виконання програми:
Алгоритми sort() і reverse()
У наступному прикладі ми відсортуємо весь вектор, виведемо відсортовані елементи, а потім виведемо їх вже в зворотному порядку:
|
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 |
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vect; vect.push_back(4); vect.push_back(8); vect.push_back(-3); vect.push_back(3); vect.push_back(-8); vect.push_back(12); vect.push_back(5); std::sort(vect.begin(), vect.end()); // виконуємо сортування елементів вектора std::vector<int>::const_iterator it; // оголошуємо ітератор for (it = vect.begin(); it != vect.end(); ++it) // виводимо за допомогою циклу і ітератора елементи вектора std::cout << *it << ' '; std::cout << '\n'; std::reverse(vect.begin(), vect.end()); // сортуємо елементи вектора в зворотному порядку for (it = vect.begin(); it != vect.end(); ++it) // виводимо за допомогою циклу і ітератора елементи вектора std::cout << *it << ' '; std::cout << '\n'; } |
Результат виконання програми:
-8 -3 3 4 5 8 12
12 8 5 4 3 -3 -8
Зверніть увагу, загальний алгоритм sort() не працює з вектором. У вектора є свій власний метод sort(), який, в даному випадку, є ефективнішим.
Висновки
Хоча це всього лише невеликий приклад алгоритмів, які надає STL, але цього вже має бути достатньо, щоб ви побачили користь і те, наскільки легко використовувати алгоритми STL в поєднанні з ітераторами і контейнерами.
