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

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

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


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


int m = std::max({1, 2, 3, 4, 5});


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


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


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++做不到吗?


微信图片_20220528173646.png


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


#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)。


相关文章
|
算法 测试技术 C#
C++算法前缀和的应用:分割数组的最大值的原理、源码及测试用例
C++算法前缀和的应用:分割数组的最大值的原理、源码及测试用例
|
5月前
|
C++
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
|
C++ Python Perl
线段树-求最大值-python|c++
线段树-求最大值-python|c++
131 0
|
6天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
31 4
|
8天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
27 4
|
30天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4
|
30天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
23 4
|
30天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
21 1
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
1月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)