Daily bit(e) C++. std::min, std::max, std::minmax
Добавлено 31 июля 2026 в 02:27
Daily bit(e) C++ 54, алгоритмы определения минимума-максимума: std::min, std::max, std::minmax.

Алгоритмы определения минимума-максимума относительно просты, но предлагают множество перегрузок, подходящих для различных вариантов использования.
В C++11 к std::min и std::max был добавлен алгоритм std::minmax, и все три алгоритма получили перегрузку для std::initializer_list.
В C++20 были введены соответствующие версии в пространстве имен std::ranges и новая перегрузка, работающая с диапазоном.
#include <algorithm>
#include <vector>
int a = 20, b = 30;
// Базовые перегрузки возвращают константную ссылку на минимальный элемент.
auto &r1 = std::min(a,b);
// &r1 == &a
b = 20;
// Стоит отметить, что и min, и max смещены
// в сторону первого аргумента.
auto &r2 = std::min(a,b);
auto &r3 = std::max(a,b);
// &r2 == &r3 == &a
// C++11 добавил std::minmax
a = 10;
b = 5;
// Возвращает пару std::pair<const&,const&>, которая может быть
// деконструирована с помощью структурированной привязки из C++17.
auto [min, max] = std::minmax(a,b);
// &min == &b, &max == &a
// Стоит помнить, что поскольку std::minmax возвращает
// std::pair<const&,const&>, передача временных значений
// приведет в результате к висячим ссылкам.
auto q = std::minmax(30, a);
// q.second - висячая ссылка
// C++11 также добавил перегрузки для списка инициализаторов.
// Они возвращают результат по значению из-за временной природы
// списков инициализаторов.
int v = std::min({5,2,4,3,9});
// v == 2
// Даже std::minmax возвращает результат по значению, т.е. std::pair<int,int>
auto [i, j] = std::minmax({5,2,4,3,9});
// i == 2, j == 9
// C++20 добавил вариант для диапазонов.
std::vector<int> data = {5,2,4,3,9};
// Принимает любой диапазон и возвращает результат по значению.
auto [x,y] = std::ranges::minmax(data);
// x == 2, y == 9
