Daily bit(e) C++. std::min_element, std::max_element и std::minmax_element
Daily bit(e) C++ #202, алгоритмы min-max, работающие с итераторами: std::min_element
, std::max_element
и std::minmax_element
.
std::min_element
, std::max_element
и (начиная с C++11) std::minmax_element
– это алгоритмы min-max, которые работают с итераторами, возвращая итератор на минимальный/максимальный элемент.
Эти алгоритмы предоставляют варианты для параллельных вычислений (C ++ 17), а также варианты для constexpr
и диапазонов (C ++ 20).
C++20 также предлагает более простую альтернативу: перегрузку базовых алгоритмов min-max для диапазонов.
#include <vector>
#include <algorithm>
std::vector<int> data{1,2,3,4,5};
auto min = std::min_element(data.begin(), data.end());
// min == data.begin(), *min == 1
auto max = std::max_element(data.begin(), data.end());
// max == std::prev(data.end()), *max == 5
auto [mi,ma] = std::minmax_element(data.begin(), data.end());
// mi == min, ma == max, *mi == 1, *ma == 5
// Если нам нужны только значения, C++20 предлагает более простую альтернативу:
auto [x,y] = std::ranges::minmax(data); // Возвращает по значению
// x == 1, y == 5
// Пример с проекциями:
struct Element {
int v;
};
std::vector<Element> elements{{2},{1},{4},{5},{3}};
// Выбрать минимальный элемент на основе значения Element::v
auto it = std::ranges::min_element(elements, {}, &Element::v);
// *it == Element{1}
Смотреть пример на Compiler Explorer.