Пространства имён
Варианты
Действия

std::max_element

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Политики исполнения (C++17)
Немодифицирующие операции над последовательностями
(C++11)(C++11)(C++11)
(C++17)
Модифицирующие операции над последовательностями
Операции разбиения
Операции сортировки
(C++11)
Операции двоичного поиска
Операции с наборами (в отсортированных диапазонах)
Операции с кучей
(C++11)
Операций минимума/максимума
max_element
(C++11)
(C++17)

Операции перестановки
Числовые операции
Операции с неинициализированной памятью
(C++17)
(C++17)
(C++17)
Библиотека C
 
Определено в заголовочном файле <algorithm>
(1)
template< class ForwardIt >
ForwardIt max_element(ForwardIt first, ForwardIt last);
(до C++17)
template< class ForwardIt >
constexpr ForwardIt max_element(ForwardIt first, ForwardIt last);
(начиная с C++17)
template< class ExecutionPolicy, class ForwardIt >
ForwardIt max_element(ExecutionPolicy&& policy, ForwardIt first, ForwardIt last);
(2) (начиная с C++17)
(3)
template< class ForwardIt, class Compare >
ForwardIt max_element(ForwardIt first, ForwardIt last, Compare cmp);
(до C++17)
template< class ForwardIt, class Compare >
constexpr ForwardIt max_element(ForwardIt first, ForwardIt last, Compare cmp);
(начиная с C++17)
template< class ExecutionPolicy, class ForwardIt, class Compare >
ForwardIt max_element(ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, Compare cmp);
(4) (начиная с C++17)

Находит наибольший элемент в диапазоне [first, last).

1) Элементы сравниваются с помощью operator<.
3) Элементы сравниваются с помощью переданной функции сравнения comp.
2,4) Аналогично (1,3), но выполнение происходит согласно policy. Эти перегрузки не участвуют в разрешении перегрузок кроме случая, когда std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> равен true.

Содержание

[править] Параметры

first, last forward-итераторы, определяющие диапазон для обработки
policy используемая политика выполнения. Подробнее смотрите политика выполнения.
cmp объект функции сравнения (т.е. объект, удовлетворяющий требованиям Compare), который возвращает true, если первый аргумент "меньше", чем второй.

Определение сравнения должно быть эквивалентно:

bool cmp(const Type1 &a, const Type2 &b);

Использование noexcept (начиная с C++11) желательно но не обязательно. Параметры не обязаны передаваться по const&, но не должны модифицироваться. Они должны быть способны принимать все значения типа (даже const) Type1 и Type2 независимо от категории значений (таким образом, Type1& не допускается, равно как и Type1, если только для Type1 перемещение не эквивалентно копированию (начиная с C++11)). Типы Type1 и Type2 должны быть таковы, что объект типа ForwardIt может быть разыменован и затем неявно преобразован в оба из них.

Требования к типам
-
ForwardIt должен соответствовать требованиям ForwardIterator.

[править] Возвращаемое значение

Итератор, указывающий на наибольший элемент в диапазоне [first, last). Если несколько элементов в диапазоне эквивалентны наибольшему элементу, то возвращается итератор на первый такой элемент. Если диапазон пуст, то возвращается last.

[править] Сложность

В точности max(N-1,0) сравнений, где N = std::distance(first, last).

[править] Исключения

Перегрузки с параметром шаблона по имени ExecutionPolicy сообщают об ошибках следующим образом:

  • Если выполнение функции, вызванной как часть алгоритма, вызывает исключение и ExecutionPolicy является одной из стандартных политик, вызывается std::terminate. Для любой другой ExecutionPolicy поведение определяется реализацией.
  • Если алгоритму не удаётся выделить память, генерируется std::bad_alloc.

[править] Возможная реализация

Первый вариант
template<class ForwardIt>
ForwardIt max_element(ForwardIt first, ForwardIt last)
{
    if (first == last) {
        return last;
    }
    ForwardIt largest = first;
    ++first;
    for (; first != last; ++first) {
        if (*largest < *first) {
            largest = first;
        }
    }
    return largest;
}
Второй вариант
template<class ForwardIt, class Compare>
ForwardIt max_element(ForwardIt first, ForwardIt last, 
                      Compare cmp)
{
    if (first == last) {
        return last;
    }
    ForwardIt largest = first;
    ++first;
    for (; first != last; ++first) {
        if (cmp(*largest, *first)) {
            largest = first;
        }
    }
    return largest;
}

[править] Пример

#include <algorithm>
#include <iostream>
#include <vector>
#include <cmath>
 
static bool abs_compare(int a, int b)
{
    return (std::abs(a) < std::abs(b));
}
 
int main()
{
    std::vector<int> v{ 3, 1, -14, 1, 5, 9 }; 
    std::vector<int>::iterator result;
 
    result = std::max_element(v.begin(), v.end());
    std::cout << "индекс максимального элемента: " << std::distance(v.begin(), result) << '\n';
 
    result = std::max_element(v.begin(), v.end(), abs_compare);
    std::cout << "индекс максимального (по модулю) элемента: " << std::distance(v.begin(), result);
}

Вывод:

индекс максимального элемента: 5
индекс максимального (по модулю) элемента: 2

[править] См. также

возвращает наименьший элемент в диапазоне
(шаблон функции) [править]
возвращает наименьший и наибольший элементы в диапазоне
(шаблон функции) [править]
возвращает большее из заданных значений
(шаблон функции) [править]