std::max_element
在标头 <algorithm> 定义 | ||
template<class ForwardIt > ForwardIt max_element( ForwardIt first, ForwardIt last ); | (1) | (C++17 起为 constexpr ) |
template<class ExecutionPolicy, class ForwardIt > ForwardIt max_element( ExecutionPolicy&& policy, | (2) | (C++17 起) |
template<class ForwardIt, class Compare > ForwardIt max_element( ForwardIt first, ForwardIt last, | (3) | (C++17 起为 constexpr ) |
template<class ExecutionPolicy, class ForwardIt, class Compare > ForwardIt max_element( ExecutionPolicy&& policy, | (4) | (C++17 起) |
寻找范围 [
first,
last)
中的最大元素。
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> 是 true。 | (C++20 前) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> 是 true。 | (C++20 起) |
目录 |
[编辑]参数
first, last | - | 要检验的元素范围的迭代器对 |
policy | - | 所用的执行策略 |
comp | - | 比较函数对象(即满足比较(Compare) 要求的对象),如果首个实参小于 第二个,则返回 true。 比较函数的签名应等价于如下: bool cmp(const Type1 &a, const Type2 &b); 虽然签名不必有 const&,函数也不能修改传递给它的对象,而且必须能够接受(可有 const 限定的)类型 |
类型要求 | ||
-ForwardIt 必须满足老式向前迭代器(LegacyForwardIterator) 。 |
[编辑]返回值
指向范围 [
first,
last)
中最大元素的迭代器。如果范围中有多个元素等价于最大元素,那么返回指向首个这种元素的迭代器。范围为空时返回 last。
[编辑]复杂度
给定 N 为 std::distance(first, last):
[编辑]异常
拥有名为 ExecutionPolicy
的模板形参的重载按下列方式报告错误:
- 如果作为算法一部分调用的函数的执行抛出异常,且
ExecutionPolicy
是标准策略之一,那么调用 std::terminate。对于任何其他ExecutionPolicy
,行为由实现定义。 - 如果算法无法分配内存,那么抛出 std::bad_alloc。
[编辑]可能的实现
max_element (1) |
---|
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;} |
max_element (3) |
template<class ForwardIt, class Compare> ForwardIt max_element(ForwardIt first, ForwardIt last, Compare comp){if(first == last)return last; ForwardIt largest = first;++first; for(; first != last;++first)if(comp(*largest, *first)) largest = first; return largest;} |
[编辑]示例
#include <algorithm>#include <cmath>#include <iostream>#include <vector> 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)<<" 值为 "<<*result <<'\n'; result = std::max_element(v.begin(), v.end(), [](int a, int b){return std::abs(a)< std::abs(b);});std::cout<<"绝对值最大的元素位于:"<<std::distance(v.begin(), result)<<" 值为 "<<*result <<'\n';}
输出:
最大元素位于:5 值为 9 绝对值最大的元素位于:2 值为 -14
[编辑]缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 212 | C++98 | [ first, last) 为空时未指定返回值 | 此时返回 last |
LWG 2150 | C++98 | 返回到第一个非最小元素的迭代器 | 改正返回值 |
[编辑]参阅
返回范围中最小元 (函数模板) | |
(C++11) | 返回范围中的最小元和最大元 (函数模板) |
返回给定值中较大者 (函数模板) | |
(C++20) | 返回范围中最大元 (算法函数对象) |