C++ max() 函数

本文介绍了C++中的max()函数,包括基本使用、如何通过自定义比较函数进行更复杂的类型比较,以及如何利用initializer_list实现多元素求最大值,提高了代码简洁性和效率。
摘要由CSDN通过智能技术生成

基本使用

调用方法

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 maxmax() 函数可扩展性强了许多。

多元素求最大值

这我认为这是 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,...}) 的形式求最大值了,非常方便。

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三日连珠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值