C++征途 --- STL中的常用算法(下)

第一部分 --- 常用排序算法

一.sort -- 对容器内元素进行排序 --- 在调用时要包含头文<algorithm> 

这个前面讲太多了,就不多加赘述了,只补充几个比较重要的点:

1.如果想从大到小排列,谓词的返回值是 return v1 > v2 ; 如果想从小到大 return v1 < v2 ;在这两个的基础上还能够再加上if,for等语法实现高级排序

2.这个算法中内置了一个从小到大排序的谓词,但是这个内置谓词只能够处理内置类型数据,如果想处理自定义类型数据,还是需要我们传一个自制的,能够处理自定义类型数据的谓词来进行排序

 二.random_shuffle -- 讲指定范围内的元素随机调整顺序 --- 在调用时要包含头文<algorithm> 

这个随机调整次序就像洗牌一样,将所有的顺序打乱

调用这个算法打乱数据有一个问题,就是无论我们运行结果多少次,打乱的结果都是一样的,这是为什么呢?

这是因为这个随机调整次序的算法的底层是靠随机数种子来实现的,但是这个算法中内置的是一个静态随机数种子,通过这个静态随机数种子生成的结果无论调用程序多少次都是一样的,除非我们使用时间戳使得这个静态随机数种子变为动态随机数种子

那么我们该怎么设置时间戳呢?

1.引用头文件 :#include < time >

2.在调用随机排序算法的代码的前补一行代码:

这行代码的作用就是设置时间戳,让其后面的随机数种子跟随系统时间改变,由静态随机数种子变为动态随机数种子 ,使得每一次调用程序的时候,随机排序算法的结果都不一样

 三.merge -- 将两个容器的元素合并,并存储到另一容器中 --- 在调用时要包含头文<algorithm> 

1.两个容器必须是有序的(而且这两个容器中的顺序必须一样,不能一个是升序一个是降序这种,而是要么都是升序,要么都是降序),且将数据放到容器中后,合并的数据还会进行在容器中进行一次排序。且排的顺序和那两个容器的顺序一致

2.存储合并数据的容器必须在存储前具有足够的内存空间去存(如果没有的话就调用resieze方法设置容器的大小(如果有这个方法的话)),不然的话程序会报错

 四.reverse -- 将容器内元素进行反转 --- 在调用时要包含头文<algorithm> 

1.所谓的将容器内元素进行反转其实就是将容器内元素的头部变成尾部,尾部变成头部


第二部分 --- 常用拷贝和替换算法 

 一.copy -- 将容器内指定范围的元素拷贝到另一容器中 --- 在调用时要包含头文<algorithm> 

1.存储拷贝数据的容器在存储前必须有足够的内存空间存储(没有的话就用resize调整大小),否则的话会导致程序出错。

2.拷贝的数据会从我们给定的第三个参数存储起始点开始存储数据 

 二.replace -- 将容器内指定范围的旧元素改为新元素 --- 在调用时要包含头文<algorithm> 

  1.旧元素的值是需要我们指定的,新元素的值也是需要我们指定的

 三.replace_if -- 将区间内满足条件的元素替换为指定元素 --- 在调用时要包含头文<algorithm> 

 1.需要我们传一个谓词(返回类型为 bool类型的仿函数),区间内的元素都会被遍历,每遍历到一个元素就将这个元素作为参数传给谓词,如果符合谓词中的条件就返回true,若为true则表示该元素符合条件,可替换为新元素,返回false则代表该元素不符合条件,不可替换新元素

 四.swap -- 互换两个容器的元素--- 在调用时要包含头文<algorithm> 

1.直接将两个容器中所有的元素 / 指向的数组 进行交换 


第三部分 --- 常用算术生成算法 --- 包含头文件 <numeric>

 一.accumulate --- 计算区间内容器元素累计总和 --- 包含头文件<numeric>

1.value值是累加的起始值 --- value + 区域内第一个元素 + 第二个 + 第三个 ....

2.这个函数有返回值,返回值类型和累加范围内的元素的类型一致

 二.fill --- 将容器中指定范围填充为指定元素 --- 包含头文件<numeric>

 


第四部分 --- 常用集合算法 --- 包含头文件<algorithm>

  一.set_intersection --- 求两个容器的交集 --- 包含头文件<algorithm>

这个 算法会返回一个指向最后一个交集元素在存储交集元素的容器中的位置的迭代器

1.调用这个算法的时候我们需要准备三个容器,容器1和容器2是用来求交集的容器,容器3则是用来储存交集的容器。

2.容器3在存储交集前必须具有足够的内存空间来存储交集:

如果容器1和容器2一样大的话,那么容器3的大小要和容器1和容器2一样大

如果容器1和容器不一样大的话,那么容器3的大小要和两个容器中大小较小的那个一样大

这样就能够保证一定可以拥有足够的内存空间存储交集(如果不够就用resize方法调整容器大小)

3.关于容器的大小比较我们可以调用 min 方法,调用这个方法并将两个容器作为参数传进去,这个方法就会返回两个容器中大小较小的容器的大小,如果一样就随便返回一个容器的大小

 (max方法同理)

4.求交集的两个容器必须是有序容器,且顺序要一样(都是升序或者都是降序)

 二.set_union --- 求两个容器的并集 --- 包含头文件<algorithm>

和上面求交集一样有两个核心要求

1.容器1和容器2必须是有序容器,且顺序要一样(都是顺序或者降序)

2.存储并集的容器在存储前必须具有足够的内存空间(存储) --- 一般将其大小设定为容器1和容器2的大小和,这样一定能够存储所有并集元素(用resize方法来调整大小)

3.这个算法也有返回值,返回值是一个指向最后一个并集元素在存储交集的容器中的位置的迭代器 

 三.set_difference --- 求两个容器的差集 --- 包含头文件<algorithm>

1.求差集分两种情况: v1 - v2(在v1集合中去掉v1和v2的交集) 和 v2 - v1(在v2集合中去掉v1和v2的交集)

2.其它要求和上面的算法一样,有序(顺序一样),三个集合,返回值,以及存储差集的容器的大小规定(这里规定和v1,v2容器中大小较大的容器的大小一样,保证一定能够装下所有差集 -- max算法求v1和v2容器中最大容器的大小)

3.在方法的参数列表中如果v1在v2前面,则求的是 v1 - v2这个差集,反之求的是v2 - v1这个差集

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值