查看: 112|回复: 0

C++标准库之三种max写法

[复制链接]

4

主题

6

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2023-4-26 15:39:57 | 显示全部楼层 |阅读模式
这里我查看cplusplus网站:
https://www.cplusplus.com/reference/algorithm/max/?kw=max


可见max有三种(这里我们以C++11的标准来看,14和11差不多),默认为两个参数,即我们平常使用的
std::cout << std::max(1, 4) << std::endl;
第一种其实不用包含头文件algorithm也能用。 而第二种和第三种则必须要包含头文件algorithm。
第二种则是可以给一个比较方法。我们先来读读标准库源码(测试环境VS2019):


可以看到,标准库首先用了noexcept关键字(C++2.0增加的关键字,如果后面表达式为true则代表一定不会抛出异常)来让程序更健壮(后面注释也说了strengthened)。 然后可以看到模板参数的_Pred其实就是一个仿函数(或函数指针,只要能让()作用即可),如果为真则这个max结果返回_Right,为假则返回_Left,我写的测试程序如下:
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    pair<int, int> FirstArg = { 1, 10 };
    pair<int, int> SecondArg = { 100, 2 };
    pair<int, int> DefaultResult = max(FirstArg, SecondArg);
    pair<int, int> CompResult = max(FirstArg, SecondArg, [](pair<int, int>a, pair<int, int>b) {return a.second < b.second; });
    cout << "DefaultResult: " << DefaultResult.first << " " << DefaultResult.second << endl;
    cout << "CompResult: " << CompResult.first << " " << CompResult.second << endl;
    return 0;
}
程序运行结果:


可以看到,默认的是比较pair的第一个数的大小,如果第一个数相等则再比较第二个数。所以返回的是SecondArg.
而使用max的第二种方法,我们给了一个lambda表达式,用来比较两个pair的second,如果第一个的second比第二个的大就返回false,false则对应返回_Left,即这里返回的是FirstArg.达到了比较pair第二个参数的目的。

第三种方法即传入多个参数,必须要用{}包起来,测试程序如下:
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    cout << max({ 1, 2, 3, 4, 5 }) << endl;
    return 0;
}
多个参数的时候必须要用{}包起来,实际上在这里编译器会将其推导为initializer_list类型,产生一个initializer_list的临时对象,然后会调用标准库中的(algorithm第9545行):


这里的_STD实际上就是::std::,接着则会调用:


可以看到,之后就是简单地在initializer_list中找到最大值就可以了。简单提一句,initializer_list的底层就是array去实现的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表