C++学习笔记【第二部分第十章:泛型算法】

泛型算法的定义

C++标准库提供了很多独立于任何特容器的算法:这些算法可用于不同类型的容器和不同类型的元素。

大多数算法都定义在头文件algorithm中,因此要使用这些泛型算法,需要#include<algorithm>
标准库还在头文件numeric中定义了一组数值泛型算法。

一般来说,这些算法并不直接操作容器,而是遍历由两个迭代器制定的一个元素范围。

迭代器令算法不依赖于容器 。

关键知识点:算法永远不会执行容器的操作

泛型算法本身不会执行容器的操作,而只会运行于迭代器之上。因此,算法永远不会改变底层容器的大小。算法可能改变容器中的值,可能移动元素的位置,但是,永远不会删除或者添加元素

初识泛型算法

  1. 只读算法(如find, count, accumulate, equal)
  2. 写容器元素的算法(如fill, fill_n, copy, replace)
  3. 重排容器元素的算法(如sort, unique)

初识泛型算法之只读算法
只会读取其输入范围内的算法,而从不改变元素。标准库函数find和count就是这样。
另一个只读算法accumulate,定义在头文件numeric。接受三个参数,前两个为需要求和的元素范围,第三个为和的初始值。

accumulate的第三个参数的类型决定了函数中使用哪个加法运算符以及返回值的类型。

string sum = accumulate(v.cbegin(), v.cend(), string(""));

这里的第三个参数是显式地创建了一个string。将空串当作一个字符串字面值传递给第三个参数是不合法的。
原因是,如果我们传递了一个字符串字面值,用于保存和的对象类型就成了const char*,而const char*并没有+运算符(但是string定义了+运算符)。

另一个只读算法是equal,用于确定两个序列是否保存相同的值。由于equal利用迭代器完成操作,因此我可以通过调用equal来比较不同类型容器中的元素。而且,元素类型也可以不一样,as long as 我们能使用==来比较这两个元素类型。比如string和const char*。

equal基于一个非常重要的假设:第二个序列至少与第一个序列一样长。

equal 的三个参数:前两个参数为第一个序列的指定范围,第三个表示第二个序列的首元素。

初识泛型算法之写容器元素的算法
一些算法会自己向输入范围写元素。
算法fill接受一对迭代器表示一个范围,还接受一个值作为第三个参数,fill将第三个参数传递的给定值赋予输入序列指定范围的元素。

算法不检查写操作。

函数fill_n接受一个单迭代器、一个计数值和一个值。它将定值赋予迭代器指向的元素开始的指定个元素。

向目的位置迭代器写入数据的算法假定目的位置足够大,能容纳要写入的元素。

一种保证算法由足够元素空间来容纳输出数据的方法是使用插入迭代器。
例如,back_inserter是定义在头文件iterator中的一个函数。
拷贝算法
copy算法接受三个参数,和equal一样。
replace算法接受四个参数,前两个表示序列的范围迭代器,第三个是要搜索的值,最后那个是新值。

初识泛型算法之重排容器元素的算法
sort排序函数是使用元素类型的<运算符来实现排序的。
unique算法重排容器中元素,使得不重复出现的元素出现在容器的开始部分。unique范围的迭代器指向最后一个不重复元素之后的位置,此位置之后的元素依旧存在,但是我们无法知道它们的值。unique并没有删除这些元素,我们得用erase成员来完成真正的删除操作。

待学习…
定制操作
再探迭代器
泛型算法结构

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值