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.
1) Для сравнения значений используется operator<.
Если T не является сравнимым оператором меньше, поведение не определено.
2) Для сравнения значений используется функция сравнения comp.
3,4) Возвращает наименьшее из значений в списке инициализации ilist.
Если ilist.size() равно нулю или T не является копируемым, поведение не определено.
3) Для сравнения значений используется operator<.
Если T не является сравнимым оператором меньше, поведение не определено.
4) Для сравнения значений используется функция сравнения comp.

Параметры

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

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

boolcmp(constType1&a,constType2&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) Пусть \(\scriptsize N\)N — это ilist.size():
3) Ровно \(\scriptsize N-1\)N-1 сравнений с использованием operator<.
4) Ровно \(\scriptsize N-1\)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 должен был быть копируемым для перегрузок (1,2) не требуется
LWG 2239 C++98
C++11
1. T должен был быть сравнимым оператором меньше для
перегрузок (2) (C++98) и (4) (C++11)
2. требования к сложности отсутствовали
1. не требуется
2. требования добавлены

См. также

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

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

Spec-Zone.ru

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