本文最后更新于:2021年2月8日 上午
min、max、min_element、max_element几个常用算法。
min、max、min_element、max_element均需要包含算法头文件#include <algorithm>
。
std::min
1 2 3 4 5 6 7 8 9 10 11
| template <class T> const T& min (const T& a, const T& b);
template <class T, class Compare> const T& min (const T& a, const T& b, Compare comp);
template <class T> T min (initializer_list<T> il); template <class T, class Compare> T min (initializer_list<T> il, Compare comp);
|
对于第一种情况,返回两个元素中最小的,若两个元素相同,则返回第一个元素。
实际上的比较是operator<
或者自定义的比较Compare
来做的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| class Cat {
public: Cat(int id) { this->id = id; }
bool operator<(const Cat& other)const { return id < other.id; }
int id; };
class CatCmp { public: bool operator()(const Cat &c1,const Cat& c2) { return c1.id < c2.id; }
};
void test1() {
cout << "min(2,4) = " << min(2, 4) << endl;
Cat c1(3); Cat c2(5); cout << "min(c1,c2) = " << min(c1, c2).id << endl;
cout << "min(c1,c2,CatCmp()) = " << min(c1, c2, CatCmp()).id << endl;
cout << "min({1,98,5,7,9,999,888})=" << min({ 1,98,5,7,9,999,888 }) << endl;
}
|
initializer_list 初始化列表
initializer_list
表示初始化列表,是一种标准库类型,用于表示某种特定类型的值的数组。
当然它也是一种模板,定义对象时应指明列表所含元素的类型。
注意:initializer_list对象中的元素永远是常量值,我们无法改变。
initializer_list可以作用于可变数量的实参:有时我们无法提前预知应该向函数传递几个实参。为了编写能处理不同数量实参的函数,C++11新标准提供了两种主要的方法:如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型;如果实参的类型不同,我们可以编写一种特殊的函数,也就是所谓的可变参数模板。
C++11标准明确规定不能由模板参数推导出对应实参std::initializer_list的类型。
C++11中的std::initializer_list的使用
std::min_element
1 2 3 4 5 6 7 8
| template <class ForwardIterator> ForwardIterator min_element (ForwardIterator first, ForwardIterator last);
template <class ForwardIterator, class Compare> ForwardIterator min_element (ForwardIterator first, ForwardIterator last,Compare comp);
|
返回值最小的元素的迭代器。假设有多个,则返回第一个。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class Cat {
public: Cat(int id) { this->id = id; } int id; };
class CatCmp { public: bool operator()(const Cat &c1,const Cat& c2) { return c1.id < c2.id; }
};
void test2() {
vector<int> v{1,4,5,7,9,2,-9,0};
vector<int>::iterator minit = min_element(v.begin(),v.end());
cout << *minit << endl;
Cat c1(3); Cat c2(5); Cat c3(1);
vector<Cat> cv{c1,c2,c3};
vector<Cat>::iterator mincat = min_element(cv.begin(), cv.end(),CatCmp());
cout << mincat->id << endl; }
|
std::max
1 2 3 4 5 6 7 8 9 10 11
| template <class T> const T& max (const T& a, const T& b);
template <class T, class Compare> const T& max (const T& a, const T& b, Compare comp);
template <class T> T max (initializer_list<T> il); template <class T, class Compare> T max (initializer_list<T> il, Compare comp);
|
std::max_element
1 2 3 4 5 6 7 8
| template <class ForwardIterator> ForwardIterator max_element (ForwardIterator first, ForwardIterator last);
template <class ForwardIterator, class Compare> ForwardIterator max_element (ForwardIterator first, ForwardIterator last,Compare comp);
|
使用方式均同min于min_element。
参考链接:
STL algorithm算法min,min_element(35)