Spec-Zone.ru › C++

std::min

Определено в заголовочном файле <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.
3,4) Возвращает наименьшее значение из значений в списке инициализации ilist.

Перегрузки (1,3) используют operator< для сравнения значений, перегрузки (2,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 можно было неявно преобразовать в оба из них.

Требования к типу
-T должно удовлетворять требованиям LessThanComparable для использования перегрузок (1,3).
-T должно удовлетворять требованиям CopyConstructible для использования перегрузок (3,4).

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

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

Сложность

1,2) Ровно одно сравнение.
3,4) Ровно ilist.size() - 1 сравнений.

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

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) не требуется

См. также

max
возвращает большее из заданных значений
(шаблон функции)
minmax
(C++11)
возвращает меньшее и большее из двух элементов
(шаблон функции)
min_element
возвращает наименьший элемент в диапазоне
(шаблон функции)
clamp
(C++17)
ограничение значения между парой граничных значений
(шаблон функции)
ranges::min
(C++20)
возвращает меньшее из заданных значений
(niebloid)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/algorithm/min

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API