C++征途 --- STL常用算法(上)

本文详细介绍了C++标准库中常用的遍历、查找和统计算法,包括for_each、transform、find、find_if、adjacent_find以及binary_search等。这些算法在处理容器数据时非常实用,涉及到函数对象、仿函数、重载运算符等概念。对于自定义类型数据,需要重载相应的运算符以配合这些算法工作。此外,文章还讲解了count和count_if算法在统计元素个数时的方法。
摘要由CSDN通过智能技术生成


第一部分 --- 常用遍历算法

一.for_each --- 遍历容器 --- 使用前引用头文件 <algorithm>

_func是一个函数参数,需要我们传

1.一个函数的函数名过去 ,这个函数名对应的函数会在遍历算法每遍历到一个元素的时候被调用一次,且遍历到的元素会作为这个函数的参数

2.一个谓词(仿函数)过去,这个仿函数采用匿名函数对象的形式传递 --- 我们自己创建一个类P,然后在这个类中重载函数调用符(),在重载函数中写我们要实现的功能(注意for_each算法会将遍历到的元素作为参数传给仿函数,所以我们在声明重载函数的时候也要准备好对应类型的参数),创建好类后,直接以实例化一个匿名函数对象的形式调用重载函数来创建一个仿函数,然后将仿函数作为参数传给_func

如最终得到的仿函数形式: P(类名)( ) --- 实际上是通过类P创建匿名对象,然后调用operator() (参数)--- 因为是匿名对象,所以对象名+点操作符来调用重载函数这部分可以省掉  --- 又operator()(参数)可以简化为(参数) --- 所以我们简化为P((参数) --- 又因为传参是在for_each算法内进行的,所以我们可以将参数省去 --- 最终变为给_func传一个 P()

二.transform --- 拷贝容器a中给定范围数据,然后用仿函数处理拷贝的数据,处理好后从给定的容器b的存储起点存储数据 --- 使用前引用头文件 <algorithm>

1.在将容器a中的数据拷贝到容器b中前,我们必须保证容器b中有足够的存储空间,如果没有要提前用resize方法开辟空间(如果能用的话)

2.这个拷贝的过程是遍历给定范围内的数据,每遍历到一个数据就会拷贝一份,然后将这个拷贝到的数据作为参数传给我们的仿函数,调用一次仿函数,仿函数的返回值就是我们最终存储到容器b中的值


第二部分 --- 常用查找算法

 

 一.find --- 查找元素 --- 使用前包含头文件 <algorithm>

1.结束迭代器指向的是容器中最后一个元素的后一位

2.这种查找方式分为两种情况:

一.内置类型数据查找(int,double等等)二.自定义类型数据查找:

对于内置类型数据查找直接查就可以了

用一个迭代器来接受返回的迭代器 

但是对于自定义类型数据是不可以像上面这样直接进行查找的

这是因为这个查找算法的底层是边遍历边进行 == 判断,而对于自定义类型数据而言,编译器中没有内置对应的 ==运算符函数来处理,所以会判断失败,进而导致查找失败。

解决方法就是进行 ==运算符函数重载,增加一个能够处理自定义类型数据的 ==运算符函数

在我们的自定义类型中重载 ==运算符函数,在这个函数中写出自定义类型数据的比较方法,这个函数的返回值类型是 bool 类型,且这个函数函数也是有参数的,参数类型就是自定义类型

重载完后find算法底层就能够正常比较以及寻找了

 二.find_if --- 按条件查找元素 --- 使用前包含头文件 <algorithm>


1.这个查找算法的底层:是先遍历,每遍历到一个元素就将这个元素作为参数传给我们谓词(注意此算法规定只能接收谓词),当它符合谓词中的条件时,谓词返回真,遍历结束并返回一个指向元素的迭代器,否则的话遍历继续,如果全遍历完还找不到的话就返回end()迭代器

(指向最后一个元素的后一位)

2.这个find_if算法只要一找到符合条件的元素就会停止寻找,并返回一个指向找到的元素的位置的迭代器

3.在find_if算法中自定义类型数据的处理步骤和内置数据类型的处理步骤一样

 三.find_if --- 查找相邻重复元素 --- 使用前包含头文件 <algorithm>

 1.什么是相邻重复:即又相邻又重复

 比如我们向vector容器中插入上面这些数据,里面重复的元素有三个,但是相邻的重复元素只有两个,就是最后两个

如果我们调用adjacent_find算法去查找的话,给定合适的范围后,算法就会找到最后这两个重复且相邻的元素,然后算法会将一个指向这些重复且相邻的元素中的第一个元素的位置迭代器返回

如果全都遍历完了都没能找到的话,这个算法会返回end()迭代器(指向最后一个元素的后一位)

同样这个算法也是一找到就会返回然后结束调用。

 三.binary_search --- 查找指定元素是否存在 --- 使用前包含头文件 <algorithm>

1. 这个查找元素是否存在的底层是靠二分法实现的

2.这个binary_search算法是无法在无序序列中使用的(binary --- 二元的)


第三部分 --- 常用统计算法

一. count --- 统计元素个数 --- 使用前包含头文件 <algorithm>

1.这个算法的作用是统计我们给定的数据在容器中出现的次数,并将统计结果返回

2.当我们统计内置类型数据的时候正常统计就可以了,但当我们统计自定义类型数据的时候就需要我们在自定义类型中对 ==运算符函数进行函数重载了,因为编译器中内置的 ==运算符函数中没有能够处理自定义类型数据的函数,这会导致count算法无法进行比较,进而无法进行统计

一. count_if --- 按条件统计元素个数 --- 使用前包含头文件 <algorithm>

1.需要我们传一个谓词(返回值类型为bool类型的仿函数),底层实现逻辑还是遍历,每遍历到一个元素就将器其作为参数传给仿函数(谓词),如果这个元素符合仿函数中的条件那么谓词返回true,次数+1,否则返回false,次数不变 

2.对于count_if算法,内置类型数据的处理和自定义类型数据的处理是一样的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值