STL专题-min,max

本文最后更新于: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
//default
template <class T> const T& min (const T& a, const T& b);

//custom
template <class T, class Compare>
const T& min (const T& a, const T& b, Compare comp);

//initializer list 初始化列表
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() {

//min

cout << "min(2,4) = " << min(2, 4) << endl; //2

Cat c1(3);
Cat c2(5);
cout << "min(c1,c2) = " << min(c1, c2).id << endl; //3

cout << "min(c1,c2,CatCmp()) = " << min(c1, c2, CatCmp()).id << endl;//3

//初始化列表
cout << "min({1,98,5,7,9,999,888})=" << min({ 1,98,5,7,9,999,888 }) << endl; //1

}

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
//default 
template <class ForwardIterator>
ForwardIterator min_element (ForwardIterator first, ForwardIterator last);


//custom
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() {

//min_element

vector<int> v{1,4,5,7,9,2,-9,0}; //初始化列表的方式

vector<int>::iterator minit = min_element(v.begin(),v.end());

cout << *minit << endl; //-9

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;//1
}

std::max

1
2
3
4
5
6
7
8
9
10
11
//default
template <class T> const T& max (const T& a, const T& b);

//custom
template <class T, class Compare>
const T& max (const T& a, const T& b, Compare comp);

//initializer list 初始化列表
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
//default 
template <class ForwardIterator>
ForwardIterator max_element (ForwardIterator first, ForwardIterator last);


//custom
template <class ForwardIterator, class Compare>
ForwardIterator max_element (ForwardIterator first, ForwardIterator last,Compare comp);

使用方式均同min于min_element。

参考链接:

STL algorithm算法min,min_element(35)


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!