std::min
Объявление
<tbody> </tbody>| Определено в заголовочном файле <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) |
Описание
ilist.operator< для сравнения значений,comp.Параметры
a, b
|
— | значения для сравнения |
ilist
|
— | список инициализации содержащий значения для сравнения |
| cmp | — | объект функции сравнения (т.е. объект, удовлетворяющий требованиям Compare), который возвращает true, если если a меньше чем b.Определение сравнения должно быть эквивалентно:
Использование |
| Требования к типам | ||
-T должен соответствовать требованиям LessThanComparable. для вариантов (1,3)
| ||
-T должен соответствовать требованиям CopyConstructible. для вариантов (3,4)
| ||
Возвращаемое значение
a и b. Если значения эквивалентны, возвращает a.ilist. Если несколько самых маленьких значений эквивалентны, возвращает первое(левое) такое значение.Предусловия
См. #Описание и Требования к типам параметров
Постусловия
[[assume(!((a<result)||(b<result)))]][[assume(!(cmp(result,a)||cmp(result,b)))]]| Этот раздел не завершён |
Исключения
Сильная гарантия, но не выше чем cmp
| Этот раздел не завершён |
Сложность
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. добавлено к требованиям |
См. также
| возвращает большее из заданных значений (шаблон функции) | |
(C++11) |
возвращает меньший и больший из двух элементов (шаблон функции) |
| возвращает наименьший элемент в диапазоне (шаблон функции) | |
(C++17) |
приводит значение к диапазону между парой граничных значений (шаблон функции) |
(C++20) |
возвращает меньшее из заданных значений (ниблоид) |