Namespaces
Variants

std::min

Из ru.cppreference.net
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например, ranges::copy, ranges::sort, ...
Немодифицирующие операции над последовательностями    
Пакетные операции
(C++17)
Операции поиска
Модифицирующие операции над последовательностями
Операции копирования
(C++11)
(C++11)
Операции обмена
Операции преобразования
Операции генерации
Операции удаления
Операции изменения порядка
(до C++17)(C++11)
(C++20)(C++20)
Операции выборки
(C++17)

Сортировка и связанные операции
Операции разделения
(C++11)    

Операции сортировки
Операции бинарного поиска
(на разбитых диапазонах)
Операции над множествами (на отсортированных диапазонах)
Операции слияния (на отсортированных диапазонах)
Операции с кучей
Операции минимума/максимума
(C++11)
(C++17)
Операции лексикографического сравнения
Операции перестановок


Политики выполнения(C++17)
(только для пояснения*)(C++26)

Числовые операции
(C++11)
(C++17)
(C++17)    

Специализированные <memory> алгоритмы

Специализированные <random> алгоритмы
Библиотека C









 
Определён в заголовке <algorithm>
template< class T >
const T& min( const T& a, const T& b );
(1) (constexpr начиная с C++14)
template< class T, class Compare >
const T& min( const T& a, const T& b, Compare comp );
(2) (constexpr начиная с C++14)
template< class T >
T min( std::initializer_list<T> ilist );
(3) (начиная с C++11)
(constexpr начиная с C++14)
template< class T, class Compare >
T min( std::initializer_list<T> ilist, Compare comp );
(4) (начиная с C++11)
(constexpr начиная с C++14)

Возвращает наименьшее из заданных значений.

1,2) Возвращает наименьшее из a и b.
1) Использует operator< для сравнения значений.
Если T не является LessThanComparable, поведение не определено.
2) Используйте функцию сравнения comp для сравнения значений.
3,4) Возвращает наименьшее из значений в списке инициализации ilist.
Если ilist.size() равно нулю, или T не является CopyConstructible, поведение не определено.
3) Использует operator< для сравнения значений.
Если T не является LessThanComparable, поведение не определено.
4) Используйте функцию сравнения comp для сравнения значений.

Параметры

a, b - значения для сравнения
ilist - список инициализации со значениями для сравнения
cmp - функциональный объект сравнения (т.е. объект, удовлетворяющий требованиям Compare), который возвращает true, если a является меньше чем b.

Сигнатура функции сравнения должна быть эквивалентна следующей:

bool cmp(const Type1& a, const Type2& b);

Хотя сигнатура не обязана иметь const&, функция не должна изменять переданные ей объекты и должна уметь принимать все значения типа (возможно const) Type1 и Type2 независимо от категории значения (таким образом, Type1& не допускается, а также Type1 если только для Type1 перемещение эквивалентно копированию(начиная с C++11)).
Типы Type1 и Type2 должны быть такими, чтобы объект типа T можно было неявно преобразовать в оба из них.

Возвращаемое значение

1,2) Наименьшее из a и b. Если значения эквивалентны, возвращает a.
3,4) Наименьшее значение в ilist. Если несколько значений эквивалентны наименьшему, возвращается самое левое из них.

Сложность

1) Ровно одно сравнение с использованием operator<.
2) Ровно одно применение функции сравнения comp.
3,4) Пусть N — ilist.size():
3) Ровно N-1 сравнений с использованием operator<.
4) Ровно N-1 применений функции сравнения comp.

Возможная реализация

min (1)
template<class T>
const T& min(const T& a, const T& b)
{
    return (b < a) ? b : a;
}
min (2)
template<class T, class Compare>
const T& min(const T& a, const T& b, Compare comp)
{
    return (comp(b, a)) ? b : a;
}
min (3)
template<class T>
T min(std::initializer_list<T> ilist)
{
    return *std::min_element(ilist.begin(), ilist.end());
}
min (4)
template<class T, class Compare>
T min(std::initializer_list<T> ilist, Compare comp)
{
    return *std::min_element(ilist.begin(), ilist.end(), comp);
}

Примечания

Захват результата std::min по ссылке приводит к висячей ссылке, если один из параметров является временным и этот параметр возвращается:

int n = -1;
const int& r = std::min(n + 2, n * 2); // r is dangling

Пример

#include <algorithm>
#include <iostream>
#include <string_view>

int main()
{
    std::cout << "smaller of 10 and 010 is " << std::min(10, 010) << '\n'
              << "smaller of 'd' and 'b' is '" << std::min('d', 'b') << "'\n"
              << "shortest of \"foo\", \"bar\", and \"hello\" is \""
              << std::min({"foo", "bar", "hello"},
                          [](const std::string_view s1, const std::string_view s2)
                          {
                              return s1.size() < s2.size();
                          }) << "\"\n";
}

Вывод:

smaller of 10 and 010 is 8
smaller of 'd' and 'b' is 'b'
shortest of "foo", "bar", and "hello" is "foo"

Отчёты о дефектах

Следующие отчёты о дефектах, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применён к Поведение, как опубликовано Корректное поведение
LWG 281 C++98 T требовалось быть CopyConstructible для перегрузок (1,2) не требовалось
LWG 2239 C++98
C++11
1. T требовалось быть LessThanComparable для
    перегрузок (2) (C++98) и (4) (C++11)
2. требования к сложности отсутствовали
1. не требовалось
2. добавлены требования

См. также

возвращает наибольшее из заданных значений
(шаблон функции & функция-объект алгоритма)
(C++11)
возвращает меньшее и большее из двух элементов
(шаблон функции & функция-объект алгоритма)
возвращает наименьший элемент в диапазоне
(шаблон функции & функция-объект алгоритма)
(C++17)
зажимает значение между парой граничных значений
(шаблон функции & функция-объект алгоритма)
возвращает наименьшее из заданных значений
(функция-объект алгоритма)