std::ranges::max_element
Defined in header <algorithm> |
||
|---|---|---|
| Call signature | ||
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) | (since 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) | (since C++20) |
1) Находит наибольший элемент в диапазоне
[first, last).
2) То же, что и (1), но использует
r в качестве исходного диапазона, как если бы ranges::begin(r) использовалось как first и ranges::end(r) как last. Функциональные сущности, описанные на этой странице, являются неблоидами, то есть:
- Явные списки аргументов шаблона не могут быть указаны при их вызове.
- Ни один из них не виден для поиска по зависимым от аргументов именам.
- Когда любой из них найден обычным поиском без квалификаторов как имя слева от оператора вызова функции, поиск по зависимым от аргументов именам запрещён.
На практике они могут быть реализованы как объекты функций или с помощью специальных расширений компилятора.
Параметры
| first, last | - | Пара iterator-sentinel, определяющая диапазон для проверки |
| r | - | Диапазон для проверки |
| comp | - | Сравнение для применения к спроецированным элементам |
| proj | - | Проекция для применения к элементам |
Возвращаемое значение
Итератор на наибольший элемент в диапазоне [first, last). Если несколько элементов в диапазоне эквивалентны наибольшему элементу, возвращает итератор на первый такой элемент. Возвращает first если диапазон пустой.
Сложность
Ровно 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;
++first;
for (; first != last; ++first)
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>
#include <vector>
int main()
{
std::vector<int> v {3, 1, -14, 1, 5, 9};
namespace ranges = std::ranges;
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/w/cpp/algorithm/ranges/max_element