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


// If we only need the values, C++ 20 offers a simpler alternative:
auto [x,y] = std::ranges::minmax(data); // Returns by-value
// x == 1, y == 5


// Example with projections:
struct Element {
    int v;
};

std::vector<Element> elements{{2},{1},{4},{5},{3}};
// Select the minimum element based on the value of Element::v
auto it = std::ranges::min_element(elements, {}, &Element::v);
// *it == Element{1}

Откройте пример в Compiler Explorer.