前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++怎么求三个数的最大值?

C++怎么求三个数的最大值?

作者头像
果冻虾仁
发布2021-12-08 10:37:28
4.5K0
发布2021-12-08 10:37:28
举报
文章被收录于专栏:后台公论

C++98的老码农们,应该都知道std::max() 函数可以从两个数中求最大值。

但其实从C++11开始,std::max()可以用来从多个数中求最大值,前提是需要搭配初始化列表。

代码语言:javascript
复制
int m = std::max({1, 2, 3, 4, 5});

注意小括号里面的大括号。这个是C++11的初始化列表。

怎么样,一次性比较多个数字,简洁不少吧。但唯一的限制是类型要一样,即使有符号的int和无符号的int放一起,也不能用std::max()。

代码语言:javascript
复制
unsigned int a = 1;
int b = 2;
int c = 3;
// 编译报错
int m1 = std::max({a, b, c});


// 编译报错
int m2 = std::max<int>({a, b, c});


// 编译成功
int m3 = std::max({(int)a, b, c});

有网友问能不能不用{}直接用max()放入多个参数来直接比较大小呢?是C++做不到吗?

当然不是。C++肯定能做到,尤其是C++11之后,引入了可变参数模板这一特性。虽然官方没有实现。我来实现一把:

代码语言:javascript
复制
#include <iostream>

namespace guodong {

template<class T>
T max(T head) {
    return head;
}

template<class T, typename... Args>
T max(T head, Args... args) {
    T t = max<T>(args...);
    return (head > t)?head:t;
}

} // end of namespace

int main() {
    int m = guodong::max(1, 2, 3);
    std::cout<<m<<std::endl;
    return 0;
}

这种可变参数模板的函数,递归展开的时候需要一个作为『终止条件』的函数。也就是上面单参的 T max(T head)。

要注意终止函数一定要在同名的可变参模板的函数之前定义,不然编译不过。

好了,再回答一下网友的问题,我想之所以C++11没有这样实现max,估计是防止max()传入过多的参数吧。一是模板实例化的时候会爆炸。二是一个函数,参数个数如果太多,其实也会影响函数调用的性能。而使用{}借助初始化列表这么一中转,max的参数个数就可以控制在一个(初始化列表作为一个参数传入max)。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程往事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档