命名空间
变体
操作

std::max

来自 cppreference.com
< cpp‎ | algorithm
 
 
算法库
受限算法和范围上的算法 (C++20)
受限算法,例如 ranges::copy, ranges::sort, ...
执行策略 (C++17)
排序和相关操作
分区操作
排序操作
二分搜索操作
(在分区范围内)
集合操作(在排序范围内)
合并操作(在排序范围内)
堆操作
最小/最大操作
max
(C++11)
(C++17)
字典序比较操作
排列操作
C 库
数值操作
未初始化内存操作
 
定义在头文件 <algorithm>
template< class T >
const T& max( const T& a, const T& b );
(1) (constexpr 自 C++14 起)
template< class T, class Compare >
const T& max( const T& a, const T& b, Compare comp );
(2) (constexpr 自 C++14 起)
template< class T >
T max( std::initializer_list<T> ilist );
(3) (自 C++11 起)
(constexpr 自 C++14 起)
template< class T, class Compare >
T max( std::initializer_list<T> ilist, Compare comp );
(4) (自 C++11 起)
(constexpr 自 C++14 起)

返回给定值中较大的那个。

1,2) 返回 ab 中较大的那个。
1) 使用 operator< 比较值。
如果 T 不是 LessThanComparable,则行为未定义。
2) 使用比较函数 comp 比较值。
3,4) 返回初始化列表 ilist 中最大的值。
如果 ilist.size() 为零,或者 T 不是 CopyConstructible,则行为未定义。
3) 使用 operator< 比较值。
如果 T 不是 LessThanComparable,则行为未定义。
4) 使用比较函数 comp 比较值。

内容

[编辑] 参数

a, b - 要比较的值
ilist - 包含要比较值的初始化列表
comp - 比较函数对象(即满足 Compare 要求的对象),如果 a 小于 b,则返回 true

比较函数的签名应等效于以下内容

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

虽然签名不需要具有 const&,但该函数不得修改传递给它的对象,并且必须能够接受类型 (可能是 const) Type1Type2 的所有值,而不管 值类别 如何(因此,Type1& 不允许Type1 也不允许,除非对于 Type1,移动等效于复制(自 C++11 起))。
类型 Type1Type2 必须使得类型 T 的对象可以隐式转换为它们两者。

[编辑] 返回值

1,2) ab 中较大的那个。如果它们相等,则返回 a
3,4) ilist 中最大的值。如果有多个值与最大值相等,则返回最左边的那个。

[编辑] 复杂度

1) 使用 operator< 进行一次比较。
2) 对比较函数 comp 进行一次应用。
3,4) 假设 Nilist.size()
3) 使用 operator< 进行 N-1 次比较。
4) 对比较函数 comp 进行 N-1 次应用。

[编辑] 可能的实现

max (1)
template<class T> 
const T& max(const T& a, const T& b)
{
    return (a < b) ? b : a;
}
max (2)
template<class T, class Compare> 
const T& max(const T& a, const T& b, Compare comp)
{
    return (comp(a, b)) ? b : a;
}
max (3)
template<class T>
T max(std::initializer_list<T> ilist)
{
    return *std::max_element(ilist.begin(), ilist.end());
}
max (4)
template<class T, class Compare>
T max(std::initializer_list<T> ilist, Compare comp)
{
    return *std::max_element(ilist.begin(), ilist.end(), comp);
}

[编辑] 注意事项

如果其中一个参数是临时变量并且该参数被返回,则通过引用捕获 std::max 的结果将产生悬垂引用。

int n = -1;
const int& r = std::max(n + 2, n * 2); // r is dangling

[编辑] 示例

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <string_view>
 
int main()
{
    auto longest = [](const std::string_view s1, const std::string_view s2)
                   {
                       return s1.size() < s2.size();
                   };
 
    std::cout << "Larger of 69 and 96 is " << std::max(69, 96) << "\n"
                 "Larger of 'q' and 'p' is '" << std::max('q', 'p') << "'\n"
                 "Largest of 010, 10, 0X10, and 0B10 is "
              << std::max({010, 10, 0X10, 0B10}) << '\n'
              << R"(Longest of "long", "short", and "int" is )"
              << std::quoted(std::max({"long", "short", "int"}, longest)) << '\n';
}

输出

Larger of 69 and 96 is 96
Larger of 'q' and 'p' is 'q'
Largest of 010, 10, 0X10, and 0B10 is 16
Longest of "long", "short", and "int" is "short"

[编辑] 缺陷报告

以下行为更改缺陷报告被追溯地应用于先前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 281 C++98 T 要求是 可复制构造 用于重载 (1,2) 不要求

[编辑] 另请参阅

返回给定值中较小的那个
(函数模板) [编辑]
(C++11)
返回两个元素中较小的和较大的那个
(函数模板) [编辑]
返回范围内最大的元素
(函数模板) [编辑]
(C++17)
将值夹在一对边界值之间
(函数模板) [编辑]
返回给定值中较大的那个
(niebloid)[编辑]