【C++】STL的标准算法

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。引发不必要的误会。

新容器需要提前开辟空间。

注意,两个集合必须是有序升序序列,降序需要使用谓词。

计算不同集合的差集只需要改变参数顺序即可。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值