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
cppreferenceint 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 < 来进行比较时,
所有输入列表{…}元素类型必须一致
cppreferenceint 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 <
cppreferencestd::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
cppreferenceint 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 <来比较元素时:
所有输入列表{…}元素类型必须一致
cppreferenceint 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 <
cppreferencestd::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
cppreferenceint 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 < 比较元素时,
所有输入列表{…}元素类型必须一致
cppreferenceint 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 <
cppreferencestd::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 <
cppreferenceint 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来比较元素
cppreferencestd::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来比较元素
cppreferencestd::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
cppreferencestd::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++ 之旅:容器和算法
算法概述表:
附上原文链接
如果文章对您有用,请随手点个赞,谢谢!^_^