STL算法
STL中的算法大致可以分为以下七类:
- 不变序列算法
- 变值算法
- 删除算法
- 变序算法
- 排序算法
- 有序区间算法
- 数值算法
大多重载的算法都是有两个版本的
- 用 “==” 判断元素是否相等, 或用 “<” 来比较大小
- 多出一个类型参数
Pred
和函数形参Pred op
: 通过表达式op(x,y)
的返回值:ture/false
判断x是否 “等于” y,或者x是否 “小于” y
不变序列算法
- 该类算法不会修改算法所作用的容器或对象
- 适用于顺序容器和关联容器
- 时间复杂度都是O(n),因为往往会遍历元素
算法 | 功能 |
---|---|
min | 求两个对象中较小的(可自定义比较器) |
max | 求两个对象中较大的(可自定义比较器) |
min_element | 求区间中的最小值(可自定义比较器) |
max_element | 求区间中的最大值(可自定义比较器) |
for_each | 对区间中的每个元素都做某种操作 |
count | 计算区间中等于某值的元素个数== |
count_if | 计算区间中符合某种条件的元素个数 |
find | 在区间中查找等于某值的元素== |
find_if | 在区间中查找符合某条件的元素 |
find_end | 在区间中查找另一个区间最后一次出现的位 置(可自定义比较器) |
find_first_of | 在区间中查找第一个出现在另一个区间中的 元素 (可自定义比较器) |
adjacent_find | 在区间中寻找第一次出现连续两个相等元素 的位置(可自定义比较器) |
search | 在区间中查找另一个区间第一次出现的位置(可 自定义比较器) |
search_n | 在区间中查找第一次出现等于某值的连续n个元 素(可自定义比较器) |
equal | 判断两区间是否相等(可自定义比较器) |
mismatch | 逐个比较两个区间的元素,返回第一次发生不 相等的两个元素的位置(可自定义比较器) |
lexicographical_compare | 按字典序比较两个区间的大小(可自定义比较器) |
find
template<class InIt, class T>
InIt find(InIt first, InIt last, const T &val);
- 返回区间 [first,last) 中的迭代器
i
,使得*i == val
。如果没找到,返回last
find_if
template<class InIt, class Pred>
InIt find_if(InIt first, InIt last, Pred pr);
- 返回区间 [first,last) 中的迭代器
i
, 使得pr(*i) == true
for_each
template<class InIt, class Fun>
Fun for_each(InIt first, InIt last, Fun f);
- 对[first, last)中的每个元素
e
, 执行f(e)
, 要求f(e)
不能改变e
count
template<class InIt, class T>
size_t count(InIt first, InIt last, const T &val);
- 计算[first, last) 中等于
val
的元素个数(x==y
为true算等于)
count_if
template<class InIt, class Pred>
size_t count_if(InIt first, InIt last, Pred pr);
- 计算[first, last) 中符合
pr(e) == true
的元素e的个数
min_element
template<class FwdIt>
FwdIt min_element(FwdIt first, FwdIt last);
- 返回[first,last) 中最小元素的迭代器, 以
<
作比较器 - 最小指没有元素比它小, 而不是它比别的不同元素都小,因为即便
a!= b
,a<b
和b<a
有可能都不成立
max_element
template<class FwdIt>
FwdIt max_element(FwdIt first, FwdIt last);
- 返回[first,last) 中最大元素(不小于任何其他元素)的迭代器
- 以
<
作比较器
关于<的例子
#include<iostream>
#include<algorithm>
using namespace std;
class A {
public:
int n;
A(int i) : n(i) {}
};
bool operator<(const A &a1, const A &a2) {
cout << "<called" << endl;
if (a1.n == 3 && a2.n == 7)
return true;
return false;
}
int main() {
A aa[] = { 3,5,7,2,1 };
cout << min_element(aa, aa + 5)->n << endl;
cout << max_element(aa, aa + 5)->n << endl;
return 0;
}
其输出结果如下:
我们注意到其min_element的输出为3。其工作流程如下,我们最开始假设3为最小值,之后进行依次遍历比较:5<3?根据我们重载的比大小表达式,显然不为真,3保持为最小值,并依次类推:7<3,etc.
而max_element的比较顺序为,假定3最大,然后比较3<5…