std::ranges::minmax_element, std::ranges::minmax_element_result
| Определено в заголовке <algorithm>
|
||
| Сигнатура вызова |
||
template< std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity,
std::indirect_strict_weak_order<std::projected<I, Proj>> Comp = ranges::less >
constexpr minmax_element_result<I>
minmax_element( I first, S last, Comp comp = {}, Proj proj = {} );
|
(1) | (начиная с C++20) |
template< ranges::forward_range R, class Proj = std::identity,
std::indirect_strict_weak_order<
std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less >
constexpr minmax_element_result<ranges::borrowed_iterator_t<R>>
minmax_element( R&& r, Comp comp = {}, Proj proj = {} );
|
(2) | (начиная с C++20) |
| Вспомогательные типы |
||
template< class I >
using minmax_element_result = ranges::min_max_result<I>;
|
(3) | (начиная с C++20) |
[first, last).r в качестве исходного диапазона, как если бы ranges::begin(r) использовалось как first, а ranges::end(r) как last.Функциональные сущности, описанные на этой странице, являются объектами-функциями алгоритмов (неформально известными как niebloids), то есть:
- Нельзя указывать явные списки аргументов шаблона при вызове любой из них.
- Ни одна из них не видна при поиске, зависящем от аргументов.
- Когда любая из них находится с помощью обычного неквалифицированного поиска в качестве имени слева от оператора вызова функции, поиск, зависящий от аргументов, подавляется.
Параметры
| first, last | - | пара итератор-страж, определяющая диапазон элементов для проверки |
| r | - |
range
для проверки
|
| comp | - | функция сравнения, применяемая к проецируемым элементам |
| proj | - | проекция, применяемая к элементам |
Возвращаемое значение
Объект, состоящий из итератора на наименьший элемент в качестве первого элемента и итератора на наибольший элемент в качестве второго. Возвращает { first, first } если диапазон пуст. Если несколько элементов эквивалентны наименьшему элементу, возвращается итератор на первый такой элемент. Если несколько элементов эквиваленты наибольшему элементу, возвращается итератор на последний такой элемент.
Сложность
Не более std:: max ( std:: floor ( 1.5 * ( N − 1 ) ) , 0.0 ) применений операции сравнения и вдвое больше применений проекции, где N = ranges:: distance ( first, last ) .
Возможная реализация
struct minmax_element_fn { template<std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity, std::indirect_strict_weak_order<std::projected<I, Proj>> Comp = ranges::less> constexpr ranges::minmax_element_result<I> operator()(I first, S last, Comp comp = {}, Proj proj = {}) const { auto min = first, max = first; if (first == last || ++first == last) return {min, max}; if (std::invoke(comp, std::invoke(proj, *first), std::invoke(proj, *min))) min = first; else max = first; while (++first != last) { auto i = first; if (++first == last) { if (std::invoke(comp, std::invoke(proj, *i), std::invoke(proj, *min))) min = i; else if (!(std::invoke(comp, std::invoke(proj, *i), std::invoke(proj, *max)))) max = i; break; } else { if (std::invoke(comp, std::invoke(proj, *first), std::invoke(proj, *i))) { if (std::invoke(comp, std::invoke(proj, *first), std::invoke(proj, *min))) min = first; if (!(std::invoke(comp, std::invoke(proj, *i), std::invoke(proj, *max)))) max = i; } else { if (std::invoke(comp, std::invoke(proj, *i), std::invoke(proj, *min))) min = i; if (!(std::invoke(comp, std::invoke(proj, *first), std::invoke(proj, *max)))) max = first; } } } return {min, max}; } template<ranges::forward_range R, class Proj = std::identity, std::indirect_strict_weak_order< std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less> constexpr ranges::minmax_element_result<ranges::borrowed_iterator_t<R>> operator()(R&& r, Comp comp = {}, Proj proj = {}) const { return (*this)(ranges::begin(r), ranges::end(r), std::ref(comp), std::ref(proj)); } }; inline constexpr minmax_element_fn minmax_element; |
Пример
#include <algorithm> #include <iostream> #include <iterator> namespace ranges = std::ranges; int main() { const auto v = {3, 9, 1, 4, 1, 2, 5, 9}; const auto [min, max] = ranges::minmax_element(v); std::cout << "min = " << *min << ", at [" << ranges::distance(v.begin(), min) << "]\n" << "max = " << *max << ", at [" << ranges::distance(v.begin(), max) << "]\n"; }
Вывод:
min = 1, at [2] max = 9, at [7]
Смотрите также
|
(C++20)
|
возвращает наименьший элемент в диапазоне
(функциональный объект алгоритма) |
|
(C++20)
|
возвращает наибольший элемент в диапазоне
(функциональный объект алгоритма) |
|
(C++20)
|
возвращает меньший и больший из двух элементов
(функциональный объект алгоритма) |
|
(C++11)
|
возвращает наименьший и наибольший элементы в диапазоне
(шаблон функции) |