0.概述
使用的主要头文件:
- <algorithm>:标准算法头文件,包含比较,交换,查找,遍历,复制,修改,排序等操作
- <functional>:其中定义了一些模板类,用以声明函数对象
- <numeric>:定义了一些在序列上面进行数学运算的函数模板
1.遍历算法
1.1 for_each(iterator begin, iterator end, function):
参数说明:两个迭代器构成遍历的区间[begin, end),function是遍历期间的行为函数。
1.2 transform(iterator begin1, iterator end1, iterator begin2, function):
参数说明:遍历原容器给的区间[begin1, end1),将数据拷贝到新容器提供的开始起点begin2,期间对数据根据函数function进行运算。
值得注意的是,新容器需要提前开辟好空间,否则会报错 cannot seek value-initialized vector iterator
。
2.查找算法
2.1 find(iterator begin, iterator end, value):
参数说明:在区间[begin, end)中找数据value,找到,返回指向value的迭代器,找不到,返回end迭代器
需要注意的是,如果要查找自定义的数据类型,则需要重载==
号来实现底层的比较
2.2 find_if(iterator begin, iterator end, _Pred):
参数说明:从区间[begin, end)中根据谓词_Pred查找,返回迭代器。
2.3 adjacent_find(iterator begin, iterator end):
参数说明:在区间[begin, end)中查找相邻重复元素的位置,返回第一个重复元素的迭代器。
2.4 binary_search(iterator begin, iterator end, value):
参数说明:在区间[begin, end)中查找指定的值value,存在返回true,不存在返回false。
值得注意的是:
- 该算法底层是使用二分查找实现的,因此只能在有序序列中查找,效率较高。
- 对于自定义数据类型和降序排列的序列,使用二分查找较为麻烦,不建议使用
2.5 count(iterator begin, iterator end, value):
参数说明:在区间[begin, end)中统计数据value的出现次数,返回值为int。
自定义的数据类型需要重载==
运算符。注意在传入参数的时候使用const来修饰自定义的数据类型。
2.6 count_if(iterator begin, iterator end, _Pred):
参数说明:在区间[begin, end)中统计满足谓词的数据的个数。
自定义数据类型可以在谓词运算中做出判断。
3.排序算法
3.1 sort(iterator begin, iterator end, _Pred)
参数说明:在区间[begin, end)内根据谓词实现内部排序。(默认升序)
值得注意的是,该算法只支持可以随机访问的容器。
3.2 random_shuffle(iterator iterator begin, iterator end):
参数说明:将区间[begin, end)内的数据随机打乱,该算法也称为洗牌算法。
3.3 merge(iterator begin1, iterator end1, iterator begin2, iterator end2, iterator begin3, _Pred):
参数说明:将区间[begin1, end1)和区间[begin2, end2)中的数据按照谓词进行合并,并存放到新的容器(begin3)中。(默认升序)
值得注意的是:
- 合并的两个容器必须是有序的,新的容器中存放的数据是排序好的
- 新的容器需要在合并前提前分配好空间
- 合并的两个容器的排序方式需要一致,(均为降序或者升序)
该算法的思想是归并排序。
3.4 reverse(iterator begin, iterator end):
参数说明:反转区间[begin, end)内的元素。
4.拷贝和替换算法
4.1 copy(iterator begin1, iterator end1, iterator begin2):
参数说明:将区间[begin1, end1)内的数据拷贝到以begin2为起点的容器中。
注意提前分配空间。
4.2 replace(iterator begin, iterator end, old_value, new_value):
参数说明:将区间[begin, end)内的数据old_value替换为new_value。返回值为void。
自定义数据类型需要重载==
4.3 replace_if(iterator begin, iterator end, _Pred, new_value):
参数说明:将区间[begin, end)内满足谓词运算的数据替换为new_value。
4.4 swap(ContainerType c1, ContainerType c2):
参数说明:将两个容器内的数据互换。
需要注意的是:
- 容器的数据类型需要相同。
- 自定义数据类型需要重载
=
赋值运算符 - 大小不一样也可以交换
5.算术生成算法
5.0 头文件
#include <numeric>
5.1 accumulate(iterator begin, iterator end, T data):
参数说明:计算区间内所有数据的和并和起始值data相加。返回值为计算结果。
5.2 fill(iterator begin, iterator end, value):
参数说明:将区间内的所有值填充为value。
6.集合运算算法
6.1 交:set_intersection(iterator begin1, iterator end1, iterator begin2, iterator end2, iterator begin3):
参数说明:计算两个集合的交集,并存放到新容器中,返回值为交集的理论end()迭代器。
因为当时开辟新容器空间时是最坏情况(较小容器的容量)。实际end()迭代器>=理论end()end迭代器。在遍历时,多余部分会自动填充0。引发不必要的误会。
新容器需要提前开辟空间。
注意,两个集合必须是有序升序序列,降序需要使用谓词。
6.2 并:set_union(iterator begin1, iterator end1, iterator begin2, iterator end2, iterator begin3):
参数说明:计算两个集合的并集,并存放到新容器中,返回值为并集的理论end()迭代器。
因为当时开辟新容器空间时是最坏情况(两个容器的容量之和)。实际end()迭代器>=理论end()end迭代器。在遍历时,多余部分会自动填充0。引发不必要的误会。
新容器需要提前开辟空间。
注意,两个集合必须是有序升序序列,降序需要使用谓词。
6.3 差:set_difference(iterator begin1, iterator end1, iterator begin2, iterator end2, iterator begin3):
参数说明:计算两个集合的差集,并存放到新容器中,返回值为差集的理论end()迭代器。
因为当时开辟新容器空间时是最坏情况(较大容器的容量)。实际end()迭代器>=理论end()end迭代器。在遍历时,多余部分会自动填充0。引发不必要的误会。
新容器需要提前开辟空间。
注意,两个集合必须是有序升序序列,降序需要使用谓词。
计算不同集合的差集只需要改变参数顺序即可。