std::min — cppreference.com
Материал из cppreference.com
Объявление
<tbody> </tbody>
| Определено в заголовочном файле |
||
|
(1) | (constexpr начиная с C++14) |
|
(2) | (constexpr начиная с C++14) |
|
(3) | (начиная с C++11) (constexpr начиная с C++14) |
|
(4) | (начиная с C++11) (constexpr начиная с C++14) |
Описание
1,2) Возвращает меньшее из двух значений.
3,4) Возвращает наименьшее из значений в списке инициализации ilist.
1,3) версии используют operator< для сравнения значений,
2,4) версии используют данную функцию сравнения comp.
Параметры
a, b
|
— | значения для сравнения |
ilist
|
— | список инициализации содержащий значения для сравнения |
| cmp | — | объект функции сравнения (т.е. объект, удовлетворяющий требованиям Compare), который возвращает true, если если a меньше чем b.
Определение сравнения должно быть эквивалентно:
Использование |
| Требования к типам | ||
-T должен соответствовать требованиям LessThanComparable. для вариантов (1,3)
| ||
-T должен соответствовать требованиям CopyConstructible. для вариантов (3,4)
| ||
Возвращаемое значение
1,2) Меньший из a и b. Если значения эквивалентны, возвращает a.
3,4) Наименьшее значение в ilist. Если несколько самых маленьких значений эквивалентны, возвращает первое(левое) такое значение.
Предусловия
См. #Описание и Требования к типам параметров
Постусловия
1) [[assume(!((a<result)||(b<result)))]]
2) [[assume(!(cmp(result,a)||cmp(result,b)))]]
Исключения
Сильная гарантия, но не выше чем cmp
Сложность
1,2) O(1) - константная.
3,4) O(ilist.size()) - пропорциональна ilist.size().
Возможная реализация
| Первый вариант |
|---|
template<class T> const T& min(const T& a, const T& b) { return (a < b) ? a : b; } |
| Второй вариант |
template<class T, class Compare> const T& min(const T& a, const T& b, Compare comp) { return (comp(a, b)) ? a : b; } |
| Третий вариант |
template<class T> T min( std::initializer_list<T> ilist) { return *std::min_element(ilist.begin(), ilist.end()); } |
| Четвёртый вариант |
template<class T, class Compare> T min(std::initializer_list<T> ilist, Compare comp) { return *std::min_element(ilist.begin(), ilist.end(), comp); } |
Пример
#include <algorithm> #include <iostream> int main() { auto inv=[](auto const&a,decltype(a)const&b)noexcept->bool{return b<a;}; std::cout << "std::min(1, 9999) = " << std::min(1, 9999) << '\n'; std::cout << "std::min('a', 'b') = " << std::min('a', 'b') << '\n'; std::cout << "std::min({4.1, 3.5, 2.5}) = " << std::min({4.1, 3.5, 2.5}) << '\n'; std::cout << "std::min(1, 9999, inv) = " << std::min(1, 9999, inv) << '\n'; std::cout << "std::min('a', 'b', inv) = " << std::min('a', 'b', inv ) << '\n'; std::cout << "std::min({4.1, 3.5, 2.5}, inv) = " << std::min({4.1, 3.5, 2.5}, inv) << '\n'; }
Вывод:
std::min(1, 9999) = 1
std::min('a', 'b') = a
std::min({4.1, 3.5, 2.5}) = 2.5
std::min(1, 9999, inv) = 9999
std::min('a', 'b', inv) = b
std::min({4.1, 3.5, 2.5}, inv) = 4.1
Defect reports
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 281 | C++98 | для (1,2) требовалось, чтобы тип T был CopyConstructible
|
не требуется |
| LWG 2239 | C++98 C++11 |
1. для вариантов (2) (C++98) и (4) (C++11) требовалось, чтобы тип T был LessThanComparable2. отсутствовали требования к сложности |
1. не требуется 2. добавлено к требованиям |
См. также
| возвращает большее из заданных значений (шаблон функции) [править] | |
| возвращает меньший и больший из двух элементов (шаблон функции) [править] | |
| возвращает наименьший элемент в диапазоне (шаблон функции) [править] | |
| приводит значение к диапазону между парой граничных значений (шаблон функции) [править] | |
| возвращает меньшее из заданных значений (ниблоид) [править] |