std::ranges::max_element
Определён в заголовке <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 I
max_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 ranges::borrowed_iterator_t<R>
max_element( R&& r, Comp comp = {}, Proj proj = {} );
| (2) | (начиная с C++20) |
1) Находит наибольший элемент в диапазоне
[first, last).
2) То же, что и (1), но использует
r в качестве исходного диапазона, как если бы ranges::begin(r) использовался в качестве first, а ranges::end(r) — в качестве last.Функциональные объекты, описанные на этой странице, являются функциональными объектами алгоритмов (неофициально называемыми niebloids), то есть:
- При вызове любого из них нельзя указывать явный список аргументов шаблона.
- Ни один из них не виден для поиска, зависящего от аргументов.
- Если любой из них найден с помощью обычного неквалифицированного поиска в качестве имени слева от оператора вызова функции, поиск, зависящий от аргументов, подавляется.
Параметры
| first, last | - | пара итератора и сентинела, задающая диапазон проверяемых элементов |
| r | - | range, который нужно проверить |
| comp | - | сравнение, применяемое к спроецированным элементам |
| proj | - | проекция, применяемая к элементам |
Возвращаемое значение
Итератор на наибольший элемент в диапазоне [first, last). Если несколько элементов диапазона эквивалентны наибольшему элементу, возвращается итератор на первый из таких элементов. Если диапазон пуст (то есть если first == last), возвращается итератор, сравниваемый на равенство с last.
Сложность
Ровно max(N - 1, 0) сравнений, где N = ranges::distance(first, last).
Возможная реализация
struct max_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 I operator()(I first, S last, Comp comp = {}, Proj proj = {}) const
{
if (first == last)
return last;
auto largest = first;
while (++first != last)
if (std::invoke(comp, std::invoke(proj, *largest), std::invoke(proj, *first)))
largest = first;
return largest;
}
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::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 max_element_fn max_element;
|
Пример
#include <algorithm>
#include <cmath>
#include <iostream>
int main()
{
namespace ranges = std::ranges;
const auto v = {3, 1, -14, 1, 5, 9, -14, 9};
auto result = ranges::max_element(v.begin(), v.end());
std::cout << "Max element at pos " << ranges::distance(v.begin(), result) << '\n';
auto abs_compare = [](int a, int b) { return std::abs(a) < std::abs(b); };
result = ranges::max_element(v, abs_compare);
std::cout << "Absolute max element at pos "
<< ranges::distance(v.begin(), result) << '\n';
}
Вывод:
Max element at pos 5 Absolute max element at pos 2
См. также
|
(C++20) | возвращает наименьший элемент диапазона (функциональный объект алгоритма) |
|
(C++20) | возвращает наименьший и наибольший элементы диапазона (функциональный объект алгоритма) |
|
(C++20) | возвращает большее из заданных значений (функциональный объект алгоритма) |
| возвращает наибольший элемент диапазона (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/ranges/max_element