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.

Daily bit(e) C++

Алгоритмы определения минимума-максимума относительно просты, но предлагают множество перегрузок, подходящих для различных вариантов использования.

В 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

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Программирование