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


相关文章
|
6月前
|
算法 测试技术 C#
C++算法前缀和的应用:分割数组的最大值的原理、源码及测试用例
C++算法前缀和的应用:分割数组的最大值的原理、源码及测试用例
|
10月前
|
C++ Python Perl
线段树-求最大值-python|c++
线段树-求最大值-python|c++
107 0
|
21天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
31 0
|
21天前
|
存储 编译器 C语言
C++入门: 类和对象笔记总结(上)
C++入门: 类和对象笔记总结(上)
30 0
存储 编译器 Linux
13 0
|
1天前
|
编译器 C++
标准库中的string类(上)——“C++”
标准库中的string类(上)——“C++”
|
1天前
|
编译器 C++
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”
|
1天前
|
存储 编译器 C++
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(上)——“C++”
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(上)——“C++”
|
2天前
|
C++
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
|
2天前
|
存储 编译器 C++
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载