Алгоритмы STL в C++
Алгоритмы STL в C++: sort, find, count, reverse, min_element — стандартные алгоритмы из заголовка <algorithm>.
Заголовок <algorithm> содержит десятки готовых алгоритмов, которые работают с любыми контейнерами STL через итераторы. Не нужно писать сортировку вручную — она уже есть.
Итераторы: begin и end
Алгоритмы принимают пару итераторов: начало и конец (не включительно). v.begin() — итератор на первый элемент, v.end() — на элемент за последним.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v = {5, 2, 8, 1, 9, 3};
std::sort(v.begin(), v.end()); // сортировка по возрастанию
for (int x : v) std::cout << x << " ";
std::cout << "\n";
return 0;
}
Вывод:
1 2 3 5 8 9
Сортировка с компаратором
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v = {5, 2, 8, 1, 9, 3};
// Сортировка по убыванию — передаём компаратор
std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });
for (int x : v) std::cout << x << " ";
std::cout << "\n";
return 0;
}
Вывод:
9 8 5 3 2 1
Полезные алгоритмы
Функция | Действие |
| сортировка по возрастанию |
| разворот |
| итератор на первый найденный x |
| количество вхождений x |
| итератор на минимальный элемент |
| итератор на максимальный элемент |
| сумма элементов (из <numeric>) |
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
int main() {
std::vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6};
// Поиск
auto it = std::find(v.begin(), v.end(), 5);
if (it != v.end())
std::cout << "5 найдено, индекс: " << (it - v.begin()) << "\n";
// Подсчёт
std::cout << "Единиц: " << std::count(v.begin(), v.end(), 1) << "\n";
// Минимум
std::cout << "Мин: " << *std::min_element(v.begin(), v.end()) << "\n";
// Сумма
int sum = std::accumulate(v.begin(), v.end(), 0);
std::cout << "Сумма: " << sum << "\n";
return 0;
}
Вывод:
5 найдено, индекс: 4 Единиц: 2 Мин: 1 Сумма: 31
Коротко
- Алгоритмы STL из
<algorithm>работают с любым контейнером через итераторы. sort(v.begin(), v.end())— сортировка; третий аргумент — компаратор.findвозвращает итератор; если не нашло —v.end().accumulate— в заголовке<numeric>, остальные — в<algorithm>.
Проверьте себя
1. Что принимают алгоритмы STL вместо конкретного контейнера?
AКонкретный тип коллекции
BПару итераторов
CРазмер массива
DУказатель на начало
2. Что вернёт find(), если элемент не найден?
Anull
B-1
CИтератор end()
Dfalse
3. Из какого заголовка подключить std::accumulate?
A<algorithm>
B<numeric>
C<math>
D<iterator>