Namespaces
Variants

std:: min

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
min
(C++11)
(C++17)
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Определено в заголовке <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 перемещение не эквивалентно копированию (since 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);
}
**Примечание:** Весь код C++ внутри тегов `
` и `` оставлен без изменений, как и требовалось. HTML-теги и атрибуты также сохранены в оригинальном виде.

Примечания

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

int n = -1;
const int& r = std::min(n + 2, n * 2); // r является висячей ссылкой

Пример

#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)
ограничивает значение между парой граничных значений
(шаблон функции)
возвращает меньшее из заданных значений
(функциональный объект алгоритма)