一、min函数的基本用法
1、min函数是c++标准库中的函数,用于返回两个参数中较小的一个。
2、函数的语法如下:min(a, b),其中a、b为两个需要比较大小的参数。
int a = 6, b = 4; int minNumber = min(a, b); // minNumber的值为4
3、除了上述用法之外,min函数还支持多个参数的比较,在多个参数中返回最小值。
int a = 6, b = 4, c = 8; int minNumber = min(a, b, c); // minNumber的值为4
二、对浮点数进行比较
1、在比较浮点数时,我们需要考虑到精度问题。
2、如果两个浮点数相减的结果非常小,比如10的负10次方,这个时候可能会出现由于精度问题而出现错误的结果。
double a = 1.0000000001, b = 1.0; double minNumber = min(a, b); // minNumber的值为1
3、为了避免上述问题,我们可以使用浮点数比较的方法。
double a = 1.0000000001, b = 1.0; double minNumber = (fabs(a-b)<1e-9)?a:b; // minNumber的值为1.0000000001
三、使用min函数比较自定义类型的对象
1、当我们需要比较自定义类型的对象时,我们需要重载小于运算符。
class Student { public: string name; int age; bool operator < (const Student& s) const { return age < s.age; } }; Student a{"Tom", 18}, b{"Lucy", 20}; Student minStudent = min(a, b); // minStudent的值为Tom, 18
四、使用自定义比较函数或Lambda表达式
1、如果我们需要对自定义类型的对象进行比较,可以使用自定义比较函数或Lambda表达式。
bool compareByName(const Student& s1, const Student& s2) { return s1.name < s2.name; } Student minStudent = min(a, b, compareByName); // minStudent的值为Lucy, 20
2、Lambda表达式是C++11中新增的一种语法,用于定义匿名函数。
Student minStudent = min(a, b, [](const Student& s1, const Student& s2){ return s1.name < s2.name; }); // minStudent的值为Lucy, 20
五、使用min_element函数返回容器中最小值的迭代器
1、min_element函数是C++标准库中的函数,用于返回容器中最小值的迭代器。
2、函数的语法如下:min_element(first, last, compareFunc),其中first和last分别是容器的起始地址和终止地址,compareFunc是一个自定义的比较函数,用来比较容器元素的大小。
3、需要注意的是,当比较基本数据类型时,不需要指定比较函数。但是,当比较自定义类型的对象时,需要提供自定义的比较函数。
vector vec{3, 5, 1, 4, 2}; auto minIter = min_element(vec.begin(), vec.end()); // minIter指向vec中的数字1
4、同样的,当我们需要使用自定义的比较函数时,只需要将自定义的比较函数作为参数传入即可。
vector stuVec{{"Tom", 18}, {"Lucy", 20}, {"Lily", 19}}; auto minStuIter = min_element(stuVec.begin(), stuVec.end(), [](const Student& s1, const Student& s2){ return s1.age < s2.age; }); // minStuIter指向年龄最小的Tom
六、使用minmax函数同时返回容器中最小值和最大值
1、minmax函数是C++标准库中的函数,用于返回容器中最小值和最大值。函数返回值是一个pair类型,其中pair.first表示最小值,pair.second表示最大值。
2、函数的语法如下:minmax(first, last, compareFunc),其中first和last分别是容器的起始地址和终止地址,compareFunc是一个自定义的比较函数,用来比较容器元素的大小。
vector vec{3, 5, 1, 4, 2}; auto minMaxPair = minmax(vec.begin(), vec.end()); // minMaxPair的值为pair(1, 5)
3、同样的,当我们需要使用自定义的比较函数时,只需要将自定义的比较函数作为参数传入即可。
vector stuVec{{"Tom", 18}, {"Lucy", 20}, {"Lily", 19}}; auto minMaxStuPair = minmax(stuVec.begin(), stuVec.end(), [](const Student& s1, const Student& s2){ return s1.age < s2.age; }); // minMaxStuPair的值为pair(Tom, Lucy)
七、使用numeric_limits类来获取最大值和最小值
1、numeric_limits是C++标准库中的类,用于获取各种数值类型的极限值。
2、通过定义numeric_limits对象的min()方法和max()方法,我们可以获取某种数据类型的最小值和最大值。
int minValue = numeric_limits::min(); // minValue的值为-2147483648 int maxValue = numeric_limits::max(); // maxValue的值为2147483647
八、完整代码
#include <iostream> #include <algorithm> #include <vector> #include <string> #include <cmath> #include <limits> using namespace std; class Student { public: string name; int age; bool operator < (const Student& s) const { return age < s.age; } }; bool compareByName(const Student& s1, const Student& s2) { return s1.name < s2.name; } int main() { int a = 6, b = 4; int minNumber = min(a, b); // minNumber的值为4 double a1 = 1.0000000001, b1 = 1.0; double minNumber1 = (fabs(a1-b1)<1e-9)?a1:b1; // minNumber1的值为1.0000000001 Student s1{"Tom", 18}, s2{"Lucy", 20}; Student minStudent1 = min(s1, s2); // minStudent1的值为Tom, 18 Student minStudent2 = min(s1, s2, compareByName); // minStudent2的值为Lucy, 20 vector vec{3, 5, 1, 4, 2}; auto minIter = min_element(vec.begin(), vec.end()); // minIter指向vec中的数字1 vector stuVec{{"Tom", 18}, {"Lucy", 20}, {"Lily", 19}}; auto minStuIter = min_element(stuVec.begin(), stuVec.end(), [](const Student& s1, const Student& s2){ return s1.age < s2.age; }); // minStuIter指向年龄最小的Tom auto minMaxPair = minmax(vec.begin(), vec.end()); // minMaxPair的值为pair(1, 5) auto minMaxStuPair = minmax(stuVec.begin(), stuVec.end(), [](const Student& s1, const Student& s2){ return s1.age < s2.age; }); // minMaxStuPair的值为pair(Tom, Lucy) int minValue = numeric_limits<int>::min(); // minValue的值为-2147483648 int maxValue = numeric_limits<int>::max(); // maxValue的值为2147483647 return 0; }
原创文章,作者:UGZOG,如若转载,请注明出处:https://www.506064.com/n/349459.html