Bootstrap

C++初学者指南-5.标准库(第一部分)--标准库最小/最大算法

C++初学者指南-5.标准库(第一部分)–标准库min/max算法


C++标准库算法是一块新领域?⇒简短介绍

min

min(a, b) → a 如果 a < b则返回a,否则返回b
min(a, b, cmp(o,o)→bool) → 如果 cmp(a,b) 为真则返回a, 否则返回b
cppreference

int const a = 2;
int const b = 9;
int x = std::min(a,b);  // int x = 2
struct P { int q; char c; };
P pmin = std::min(P{1,'y'}, P{2,'x'}, 
 [](P p1, P p2){ return p1.q < p2.q; });  // P pmin {1,'y'};

运行示例代码

min({v1,v2,v3,…}) → 求最小值 (C++11)
min({v1,v2,v3,…}, cmp(o,o)→bool) → 求最小值
第二个版本使用cmp来比较元素
当第一个版本使用 operatior < 来进行比较时,
所有输入列表{…}元素类型必须一致
cppreference

int const a = 2;
int const b = 9;
int x = std::min({3,4,b,3,a,8});  // int x = 2

运行示例代码

ranges::min(range) → 求最小值 (C++20)
ranges::min(range, cmp(o,o)→bool) → 求最小值
返回范围内最小元素的常量引用
第二个版本使用 cmp 来比较元素,而第一个版本使用 operator <
cppreference

std::vector<int> v {7,9,3,5,3,1,4,8};
auto x = std::ranges::min(v);  // int x = 1
struct P { int q; char c; };
std::vector<P> const w {P{3,'a'},P{1,'c'},P{2,'b'}};
auto pmin = std::ranges::min(w, 
 [](P const& p1, P const& p2){ return p1.q < p2.q; });  // P pmin {1,'c'}

运行示例代码

max

max(a, b) → 如果 a < b为假则返回a,否则返回b
max(a, b, cmp(o,o)→bool) → 如果 cmp(a,b) 为假则返回a,否则返回b
cppreference

int const a = 2;
int const b = 9;
int x = std::max(a,b);  // int x = 9
struct P { int q; char c; };
P pmax = std::max(P{1,'y'}, P{2,'x'}, 
 [](P p1, P p2){ return p1.q < p2.q; });  // P pmax {2,'x'};

运行示例代码

max({v1,v2,v3,…}) → 求最大值 (C++11)
max({v1,v2,v3,…}, cmp(o,o)→bool) → 求最大值
第二个版本使用 cmp 来比较元素
当第一个版本使用operator <来比较元素时:
所有输入列表{…}元素类型必须一致
cppreference

int const a = 2;
int const b = 9;
int x = std::max({3,4,b,3,a,8});  // int x = 9

运行示例代码

ranges::max(range) → 求最大值 (C++20)
ranges::max(range, cmp(o,o)→bool) → 求最大值
返回范围内最大元素的常量引用
第二个版本使用cmp用于比较元素,而第一个版本使用operator <
cppreference

std::vector<int> v {7,9,3,5,3,1,4,8};
auto x = std::ranges::max(v);  // int x = 9
struct P { int q; char c; };
std::vector<P> const w {P{1,'c'},P{3,'a'},P{2,'b'}};
auto pmax = std::ranges::max(w, 
 [](P p1, P p2){ return p1.q < p2.q; });  // P pmax {3,'a'}

运行示例代码

minmax

minmax(a, b) → {最小值, 最大值}  (C++11)
minmax(a, b, cmp(o,o)→bool) → {最小值,最大值}
如果a的排序在b之前,比较函数/对象cmp(a,b)必须返回true
cppreference

int a = 2;
int b = 9;
auto p = std::minmax(a,b);  // std::pair<int,int> p {2,9}
auto min = p.first;  // int min = 2
auto max = p.second; // int max = 9
auto [lo,hi] = std::minmax(a,b);  // int lo = 2, hi = 9  C++17

运行示例代码

minmax({v1,v2,v3,…}) → {最小值,最大值}  (C++11)
minmax({v1,v2,v3,…}, cmp(o,o)→bool) → {最小值,最大值}
第二个版本使用 cmp 来比较元素,
当第一个版本使用 operator < 比较元素时,
所有输入列表{…}元素类型必须一致
cppreference

int const a = 2;
int const b = 9;
auto p = std::minmax({3,0,b,3,a,8});  // std::pair<int,int> p {0,9}
auto min = p.first;  // int min = 0
auto max = p.second; // int max = 9
auto [lo,hi] = std::minmax({3,0,b,3,a,8});  // int lo = 0, hi = 9  C++17

运行示例代码

ranges::minmax(range) → {最小值,最大值} (C++20)
ranges::minmax(range, cmp(o,o)→bool) → {最小值,最大值}
返回一对范围内的最小和最大元素的常量引用; 第2版使用cmp来比较元素,而第1版使用 operator <
cppreference

std::vector<int> v {7,9,3,5,3,1,4,8};
auto p = std::ranges::minmax(v);  // std::pair<int,int> p {1,9}
auto [min,max] = std::ranges::minmax(v);
struct P { int q; char c; };
std::vector<P> const w {P{3,'a'},P{2,'b'},P{1,'c'}};
auto [lo,hi] = std::ranges::minmax(w, 
 [](P p1, P p2){ return p1.q < p2.q; });  // P lo {1,'c'}, hi {3,'a'}

运行示例代码

clamp (C++17)

clamp(value, lo, hi) → 返回限定值
clamp(value, lo, hi, cmp(o,o)→bool) → 返回限定值
限定值在lo和hi之间
第二个版本使用 cmp 来比较值,而不是用 operator <
cppreference

int a = std::clamp( 8,  1, 5);  // int a =  5
int b = std::clamp(-4,  1, 5);  // int b =  1
int c = std::clamp(-4, -2, 5);  // int c = -2

运行示例代码

min_element

在这里插入图片描述
第二个版本使用“compare”来比较元素,
而第一个版本使用 operator <
cppreference
在这里插入图片描述
运行示例代码

在这里插入图片描述
使用operator < 来比较元素;或者可以作为第二个参数传递自定义的函数对象 comp来比较元素
cppreference

std::vector<int> v {7,9,3,5,3,2,4,1,8,0};
auto i = std::ranges::min_element(v);
auto min = *i;  // int min = 0

运行示例代码

max_element

在这里插入图片描述

第二个版本使用“compare”来比较元素,
而第一个版本使用 operator <
cppreference
在这里插入图片描述
运行示例程序

在这里插入图片描述
使用operator < 来比较元素;或者可以作为第二个参数传递自定义的函数对象 comp来比较元素
cppreference

std::vector<int> v {7,9,3,5,3,2,4,1,8,0};
auto i = std::ranges::max_element(v);
auto max = *i;  // int max = 9

运行示例代码

minmax_element

在这里插入图片描述
返回一个指向输入范围中最小和最大元素的迭代器对std::pair;
第二个版本使用 comp 来比较元素,
而第一个版本使用 operator <
cppreference
在这里插入图片描述
运行示例代码

在这里插入图片描述
返回一个std::pair,其中包含输入范围中最小和最大元素的迭代器;
使用operator < 来比较元素;或者作为第二个参数传递一个自定义函数(对象)cmp
cppreference

std::vector<int> v {7,1,3,5,3,8,6,2,9,0};
auto [i,j] = std::ranges::minmax_element(v);
auto min = *i;  // int min = 0
auto max = *j;  // int max = 9

运行示例代码

相关内容

视频:最大最小算法 by Conor Hoekstra
标准算法概述
C++标准库算法介绍
标准序列容器(vector、deque、list、…)
标准关联容器(map、set、…)
标准序列视图
cppreference:算法库
cppreference:容器库
视频:什么是 C++ 标准库?
视频:一小时内掌握 105 个 STL 算法 (Jonathan Boccara,2018)
C++ 之旅:容器和算法
算法概述表:
在这里插入图片描述
附上原文链接
如果文章对您有用,请随手点个赞,谢谢!^_^

;