C++STL的泛型算法

泛型算法只是依赖于迭代器的操作,而不是依赖于容器

泛型算法可以分为3大类:

下面的vec和vec2代表相同类型的容器

1.只读算法:只允许读取其输入范围内的元素,而不改变元素

find(vec.cbegin(), vec.cend(), k)

查找算法:前两个参数表示元素范围的迭代器,第三个参数k表示要查找的元素,查找成功则返回等于第一个元素的迭代器,查找失败返回尾后指针

accumulate(vec.cbegin(), vec.cend(), 0)

求和算法:前两个参数表示元素范围的迭代器,第三个参数表示和的初始值,返回该类型的参数范围内的和,可以为int,string等

equal(vec.cbegin(), vec.cend(), vec2.cbegin() )

比较算法:将第一个范围内的元素和第二个序列中的元素比较,如果对应元素都相等,返回true,否则返回false,这里默认第二个序列的元素数>=第一个范围内的元素数

2.写容器元素算法:将元素写入输入范围

fill(vec.cbegin(), vec.cend(), 0)

表示迭代器范围内的值都被置为0(假设vec存的是int型)

fill_n(vec.begin(), vec.size(), 0)

表示从指定迭代器 vec.begin() 开始以后的vec.size()个元素的值都被置为0(假设vec存的是int型)

注:上面的写算法不允许在空容器上调用,即容器中有几个元素,写算法才能写几个元素,只能修改,不能添加,如果想要添加只能使用插入迭代器(下篇会介绍)

copy(vec.cbegin(), vec.cend(), vec2.cbegin())

拷贝算法:将迭代器范围内的元素拷贝到vec2容器中,这里默认第二个容器的空间能够存储该迭代器范围内的元素

replace(vec.cbegin(), vec.cend(), before, after)

替换算法:将容器迭代器范围内的元素中 所有为before的元素替换为after的元素,before和after分别为存储类型的具体数值

replace_copy(vec.cbegin(), vec.cend(), back_inserter(vec2), before, after)

替换算法:将容器迭代器范围内的元素中 所有为before的元素替换为after的元素,并插入到vec2中,before和after分别为存储类型的具体数值

3.重排容器元素算法

sort(vec.cbegin(), vec.cend())

排序算法:将迭代器范围内的元素按照定义的“<”来进行排序

unique(vec.cbegin(), vec.cend())

排序算法:将迭代器范围内的元素按照unique的标准库算法进行排序,使得不重复的元素出现在开始的位置,并且返回一个指向最后一个不重复元素之后的迭代器

注:要真正删除容器中的元素,必须使用容器操作,泛型算法只是依赖于迭代器的,向容器中插入元素可以不必使用容器操作,可以使用插入迭代器操作。



最全面的STL泛型算法总结:

当前的STL一共有85个通用算法,这些算法可以使用在所有的STL容器上。有的容器拥有与通用算法函数相同功能的成员函数,则优先使用成员函数版本。

所有的这些通用算法在这里可以查询得到。

这些通用算法的参数 和 返回值一般都有迭代器(通过迭代器,将算法与数据结构解耦),用来表示元素在容器中的位置(前后两个迭代器,组成一个左闭右开的区间)。

一、非修改型算法
函数名 参数 功能
1、 all_of() 区间 + 一元谓词 判断区间中所有元素是否都满足谓词条件。
2、 any_of() 区间 + 一元谓词 判断区间中是否有一个元素满足谓词条件。
3、 none_of() 区间 + 一元谓词 判断区间中的元素是否都不满足谓词条件。(全部都不满足的否定是至少有一个满足,none_of() 和 any_of() 的结果是对立的)。
4、 for_each() 区间 + 一元可调用对象 对每个元素都执行该一元操作,注意函数的返回值是该一元操作对象,需要注意当一元操作对象是有状态的情况。
5、 find()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值