Алгоритмы представляют специальные функции, которые определены в модуле <algorithm> и выполняются над контейнерами элементов. Разберем наиболее распространенные.
Функции std::min_element и std::max_element возвращают минимальный и макисмальный элементы соответственно из некоторого диапазона. В качестве коллекции элементов может выступать контейнер или массив. Диапазон элементов задается начальным и конечным итераторами контейнера/массива.
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> numbers { 1, 2, 3, 4, 5, 6, 7, 8}; std::cout << "Min: " << *std::min_element(begin(numbers), end(numbers)) << std::endl; std::cout << "Max: " << *std::max_element(begin(numbers), end(numbers)) << std::endl; }
Здесь находим минимальный и максимальный элементы вектора numbers. В обоих случаях в качестве диапазона выступает весь контейнер - от итератора
begin(numbers)
до итератора end(numbers). Результатом каждой функции также является итератор. Потому для получения значения (максимального/минимального значения)
применяем операцию разыменования: *std::min_element(...)
. Консольный вывод:
Min: 1 Max: 8
Поскольку диапазон поиска значений представляет необязательно весь контейнер, а может быть только частью контейера, ограниченной итераторами, то мы можем найти максимальное/минимальное значения на каком-то определенном диапазоне, например, от 2-го до предпоследнего элемента:
std::cout << "Min: " << *std::min_element(begin(numbers), end(numbers)) << std::endl; std::cout << "Max: " << *std::max_element(begin(numbers), end(numbers)) << std::endl;
Также для получения мин/макс. значений можно принименять функцию std::minmax_element(), которая также используется итераторы для задания
диапазона поиска. Но результат возвращает в виде объекта std::pair<iterator, iterator>
:
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> numbers { 1, 2, 3, 4, 5, 6, 7, 8}; const auto [min, max] = std::minmax_element(begin(numbers), end(numbers)); std::cout << "Min: " << *min << std::endl; std::cout << "Max: " << *max << std::endl; }