基本使用
调用方法
max()
函数最基本,也是最常用的形式是这样的定义在 std
命名空间中,调用时可以使用 <algorithm>
(推荐),但是有些编译器中 <iostream>
中也已经包含有了这个函数。
定义
template<typename _Tp> // 定义一种名为 _Tp 的类型
_GLIBCXX14_CONSTEXPR // 这行无需知道
inline const _Tp&
max(const _Tp& __a, const _Tp& __b)
{
// concept requirements
__glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
// 定义比较函数为默认小于号
//return __a < __b ? __b : __a; 三目运算符写法,展开后就是下面的形式
if (__a < __b)
return __b;
return __a;
}
总之,这种形式的 max()
是通过默认类型的小于号,来得到更大的那个数值。
进阶使用
自定义比较函数
max()
的基本形式只能支持
C++
\text{C++}
C++ 内置变量类型的比较,但是如果我们需要比较两个(甚至多个,后面会讲到)自定义类型(例如结构体和类),那么基本的 max()
就不能直接满足我们的需求了,那么有两种解决方法:
- 在自定义类型的内部定义好比较函数,那么
max()
就会使用自定义类型内部的小于号。 - 使用函数重载的
max()
,这也是这一小节讨论的重点。
定义
template<typename _Tp, typename _Compare> // 新多定义了一个比较函数的类型
_GLIBCXX14_CONSTEXPR
inline const _Tp&
max(const _Tp& __a, const _Tp& __b, _Compare __comp)
// __comp 可以是自己手写的函数,也可以是 lambda,也可以是 functor(仿函数)
{
//return __comp(__a, __b) ? __b : __a;
if (__comp(__a, __b)) // 直接用提供的比较函数进行判断大小
return __b;
return __a;
}
这种方法允许程序员可以对任意类型求
max
\max
max,max()
函数可扩展性强了许多。
多元素求最大值
这我认为这是 max()
最优秀的地方!固然,我们可以将多个元素建一个数组临时存储,然后遍历一遍或者使用 max_element()
进行求解,但是这都会让代码变得繁琐,但是
C++
\text{C++}
C++ 新标准中引入的 initializer_list
就解决了这个问题。这种方法允许用大括号将一系列的数值一股脑塞进 max()
中。这样,对于少量元素但是多于两个的情况就有了很好的解决。
定义
template<typename _Tp>
_GLIBCXX14_CONSTEXPR
inline _Tp
max(initializer_list<_Tp> __l) // 这相当于读入一个数组
{ return *std::max_element(__l.begin(), __l.end()); }
// 函数内用 max_element 看起来让写的代码简单了许多
这样我们就可以用 max({a, b, c, d,...})
的形式求最大值了,非常方便。