C++标准库—STL算法

STL算法库:#include<algorithm>

lambda表达式:使用内嵌匿名函数,不必编写独立函数

[捕捉块] (参数) (可选mutable等) ->return_type{body}

mutable将调用标记为非const,如果不加,则不能修改捕捉的参数值;

return_type指定返回值的类型,如果忽略,编译器会进行推断;

[]开始,可以接受参数,可以返回值;auto return=[](int a,int b){return a+b;}

[]称为捕捉块,可以在作用域中捕捉变量,表示可以在lambda表达式体中使用该变量,也可以按引用捕捉

[=]:通过值捕捉所有变量;[&]:通过引用捕捉所有变量;

<functional>中的std::function可以包装函数对象:

function<double(int,int)> myWrapper;//封装了一个接受两个整型参数返回double的函数

这样,可以将封装与lambda表达式结合起来,实现lambda表达式做为返回值、lambda表达式作为函数参数等;


泛型算法是建立在迭代器之上的,不依赖于容器,也不会执行容器的操作。

不修改序列算法

1.搜索算法

(1)find(),需要传入三个参数:起点迭代器、终点迭代器、查找的值

返回迭代器(找到的点对应的位置,如果未找到,值为end())

(2)find_if(),find_if_not()接受函数回调(或者是lambda表达式等等)作为第三个参数,返回满足条件的位置

(3)auto res=minmax_element(beginIter,endIter)//*(res.first)为最小,*(res.second)为最大

min_element/max_element(beginIter,endIter)返回对应值得迭代器

(4)adjacent_find(beginIter,endIter)返回第一对相邻相等值的迭代器

2.比较算法

(1)equal(),所有对应位置参数相等,则返回true,要求两个容器数目相同

equal(container1.begin(),container1.end(),container2.begin())

(2)mismatch(),返回多个迭代器集合,表示范围中对应的不匹配的元素

auto miss=mismatch(container1.begin(),container1.end(),container2.begin())

(3)lexicographical_compare()可以处理元素个数不相等的情况,第一个不相等的前者较小或者前者个数少返回真

lexicographical_compare(container1.begin(),container1.end(),container2.begin(),container2.end())

3.工具算法

(1)all_of(container.begin(),container.end(),lambda表达式)判断是否全部满足条件

(2)any_of(container.begin(),container.end(),lambda表达式)判断是否至少有一个满足条件

(3)none_of(container.begin(),container.end(),lambda表达式)判断是否全部不满足条件

(4)count_if(container.begin(),container.end(),lambda表达式)返回满足条件的个数

修改序列算法

1.转换transform(源开始,源结束,目标开始,目标结束,回调函数)

如果希望原地转换,则源和目标范围可以是一样的

二元回调:transform(源1开始,源1结束,源2开始,结果首迭代器,回调函数)

2.复制copy(源开始,源结束,目标开始)

范围必须不同,但可以重叠

copy_backward(源开始,源结束,目标开始)可以实现反向复制

3.移动move(源开始,源结束,目标开始)

move_backward(源开始,源结束,目标开始)

4.替换replace(开始点,结束点,oldvalue,newvalue) 将范围内的老值换成新值

replace_if(开始点,结束点,lambda表达式,value)将范围内满足条件的值换成新值

5.删除remove(开始点,结束点,lambda表达式)

6.唯一化unique(开始点,结束点) 删除重复的值

7.反转reverse(开始点,结束点) 就地反转

操作算法

for_each(开始点,结束点,回调函数){函数体}对每一个点执行回调函数

分区算法

partition_copy(源开始,源结束,目标1开始,目标2开始,真值lambda表达式)

根据lambda表达式的返回值将源容器中的值复制到两个目标容器当中;

算法的返回结果是一对迭代器,第一个指向目标1最后元素的后一个位置,第二个指向目标2最后元素后一个位置

partition(开始点,结束点,真值lambda表达式)

根据表达式值将container分成两部分true在前面(快排里面有利用)

排序算法

只能应用于顺序容器

sort(开始点,结束点)也可以指定一个比较回调,默认operator<(递增)

数值处理算法

1.accumulate(开始点,结束点,初始值,操作回调)#include<numeric>

计算容器中所有元素的总和或者其他算术值

2.inner_product(容器1开始点,容器1结束点,容器2开始点,0)计算两个序列的内积 #include<numeric>

3.iota(开始点,结束点,给定值)生成一个指定范围内的序列值,从给定值开始,按递增的方式#include<numeric>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值