stl算法类别
• 不变序列算法
• 变值算法
• 删除算法
• 变序算法
• 排序算法
• 有序区间算法
• 数值算法
大多重载的算法都是有两个版本的
• 用 “==” 判断元素是否相等, 或用 “<” 来比较大小
• 多出一个类型参数 “Pred” 和函数形参 “Pred op” :
通过表达式 “op(x,y)” 的返回值: ture/false
判断x是否 “等于” y,或者x是否 “小于” y
如下面的有两个版本的min_element:
iterator min_element(iterator first, iterator last);
iterator min_element(iterator first, iterator last, Pred op);
不变序列算法
- 该类算法不会修改算法所作用的容器或对象
- 适用于顺序容器和关联容器
- 时间复杂度都是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 按字典序比较两个区间的大小(可自定义比较器)
min_element和max_element的实例
重载小于号运算符后,取数组中的最大和最小值
#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;
}
/*
输出:
< called
< called
< called
< called
3
< called
< called
< called
< called
7
*/
2.变值算法
此类算法会修改源区间或目标区间元素的值,值被修改的那个区间, 不可以是属于关联容器的
for_each 对区间中的每个元素都做某种操作
copy 复制一个区间到别处
copy_backward 复制一个区间到别处, 但目标区前是从后往前被修改的
transform 将一个区间的元素变形后拷贝到另一个区间
swap_ranges 交换两个区间内容
fill 用某个值填充区间