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

cpp/algorithm/max element — различия между версиями

Материал из cppreference.com
< cpp‎ | algorithm
м (1 версия: Translate from the English version)
 
(не показаны 6 промежуточных версий 4 участников)
Строка 1: Строка 1:
{{tr_note}}
 
 
{{cpp/title|max_element}}
 
{{cpp/title|max_element}}
 
{{cpp/algorithm/navbar}}
 
{{cpp/algorithm/navbar}}
{{ddcl list begin}}
+
{{begin}}
{{ddcl list header | algorithm}}
+
{{header | algorithm}}
{{ddcl list item | num=1 |
+
{{| num=1
template< class ForwardIt >
+
|
ForwardIt max_element( ForwardIt first, ForwardIt last );
+
template< class ForwardIt >  
 +
ForwardIt max_element(ForwardIt first, ForwardIt last);
 
}}
 
}}
{{ddcl list item | num=2 |
+
{{
 +
 +
 +
 +
 +
| num= 2
 +
 +
 +
 +
|
 
template< class ForwardIt, class Compare >
 
template< class ForwardIt, class Compare >
ForwardIt max_element( ForwardIt first, ForwardIt last, Compare comp );
+
ForwardIt max_element(ForwardIt first, ForwardIt last, Compare );
 
}}
 
}}
{{ddcl list end}}
+
{{
 +
 +
 +
 +
end}}
 +
 +
 +
 +
 +
 
 +
  
Finds the greatest element in the range {{tt|[first, last)}}. The first version uses {{c|operator<}} to compare the values, the second version uses the given comparison function {{tt|comp}}.
+
{{tt|}}.
 +
{{|}}
 +
,{{tt|}} .
  
 
===Параметры===
 
===Параметры===
{{param list begin}}
+
{{begin}}
{{param list item | first, last |{{tr| вперед итераторы определении диапазона для изучения| forward iterators defining the range to examine}}}}
+
{{| first, last | итераторыдля }}
{{param list cmp | cmp | p1=ForwardIt | if {{tt|*a}} is ''less'' than {{tt|*b}}}}
+
}}
{{param list hreq}}
+
{{cmp | cmp | p1=ForwardIt }}  
{{param list req concept | ForwardIt | ForwardIterator}}
+
{{hreq}}
{{param list end}}
+
{{req concept | ForwardIt | ForwardIterator}}
 +
{{end}}
  
===Возврат стоимости===
+
======
Iterator to the greatest element in the range {{tt|[first, last)}}. If several elements in the range are equivalent to the greatest element, returns the iterator to the first such element. Returns {{tt|last}} if the range is empty.
+
{{tt|[first, last)}}. , . {{tt|last}}.  
  
 
===Сложность===
 
===Сложность===
{{tr|Именно {{math|max(N-1,0)}} сравнений, где {{c|N {{=}} std::distance(first, last)}}.|Exactly {{math|max(N-1,0)}} comparisons, where {{c|N {{=}} std::distance(first, last)}}.}}
+
{{math|max(N-1,0)}} сравнений, где {{c|N {{=}} std::distance(first, last)}}.
  
===Возможные реализации===
+
===
 +
 +
 
 +
===
 
{{eq fun
 
{{eq fun
 
  | 1=
 
  | 1=
Строка 50: Строка 75:
 
  | 2=
 
  | 2=
 
template<class ForwardIt, class Compare>
 
template<class ForwardIt, class Compare>
ForwardIt max_element(ForwardIt first, ForwardIt last,
+
ForwardIt max_element(ForwardIt first, ForwardIt last,  
                            Compare comp)
+
Compare )
 
{
 
{
 
     if (first == last) {
 
     if (first == last) {
Строка 59: Строка 84:
 
     ++first;
 
     ++first;
 
     for (; first != last; ++first) {
 
     for (; first != last; ++first) {
         if (comp(*largest, *first)) {
+
         if ((*largest, *first)) {
 
             largest = first;
 
             largest = first;
 
         }
 
         }
Строка 83: Строка 108:
 
int main()
 
int main()
 
{
 
{
     std::vector<int> v{ 3, 1, -14, 1, 5, 9 };
+
     std::vector<int> v{ 3, 1, -14, 1, 5, 9 };  
 
     std::vector<int>::iterator result;
 
     std::vector<int>::iterator result;
  
 
     result = std::max_element(v.begin(), v.end());
 
     result = std::max_element(v.begin(), v.end());
     std::cout << "max element at: " << std::distance(v.begin(), result) << '\n';
+
     std::cout << ": " << std::distance(v.begin(), result) << '\n';
  
 
     result = std::max_element(v.begin(), v.end(), abs_compare);
 
     result = std::max_element(v.begin(), v.end(), abs_compare);
     std::cout << "max element (absolute) at: " << std::distance(v.begin(), result);
+
     std::cout << "() : " << std::distance(v.begin(), result);
 
}
 
}
 
  | output=
 
  | output=
max element at: 5
+
: 5
max element (absolute) at: 2
+
() : 2
 
}}
 
}}
  
 
===См. также===
 
===См. также===
{{dcl list begin}}
+
{{begin}}
{{dcl list template | cpp/algorithm/dcl list min_element}}
+
{{| cpp/algorithm/min_element}}
{{dcl list template | cpp/algorithm/dcl list minmax_element}}
+
{{| cpp/algorithm/minmax_element}}
{{dcl list template | cpp/algorithm/dcl list max}}
+
{{| cpp/algorithm/max}}
{{dcl list end}}
+
 
 +
{{end}}
  
 +
 +
 
[[es:cpp/algorithm/max element]]
 
[[es:cpp/algorithm/max element]]
 
[[fr:cpp/algorithm/max element]]
 
[[fr:cpp/algorithm/max element]]
 +
 
[[ja:cpp/algorithm/max element]]
 
[[ja:cpp/algorithm/max element]]
 
[[pt:cpp/algorithm/max element]]
 
[[pt:cpp/algorithm/max element]]
[[ru:cpp/algorithm/max element]]
+
[[:cpp/algorithm/max element]]

Текущая версия на 06:48, 29 января 2018

 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (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

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

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