|
这里我查看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 << &#34;DefaultResult: &#34; << DefaultResult.first << &#34; &#34; << DefaultResult.second << endl;
cout << &#34;CompResult: &#34; << CompResult.first << &#34; &#34; << 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去实现的。 |
|