C++ Primer 学习笔记_45_STL实践与分析(19)--泛型算法的结构
STL实践与分析
--泛型算法的结构
引言:
正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础。
算法最主要的性质是须要使用的迭代器种类。全部算法都指定了它的每一个迭代器形參可使用的迭代器类型。比方,假设形參必须为随机訪问迭代器则可提供vector或 deque类型的迭代器,或者提供指向数组的指针。而其它容器的迭代器不能用在这类算法上。
C++还提供了另外两种算法模式:一种模式由算法所带的形參定义;还有一种模式则通过两种函数命名和重载的规范定义。
一、算法的形參模式
大多数的算法都採用以下四种形參模式:
alg(beg,end,other parms);
alg(beg,end,dest,other parms);
alg(beg,end,beg2,other parms);
alg(beg,end,beg2,end2,other parms);
当中,alg是算法的名字,beg和end指定算法操作的元素范围。我们通常将该范围成为算法的“输入范围”。
1、带有单个目标迭代器的算法
dest形參是一个迭代器,用于指定存储输出数据的目标对象。
调用这些算法时,必须确保输出容器有足够大的容量存储输出数据。
假设dest是容器上的迭代器,则算法将输出内容写到容器中已存在的元素上。更普遍的使用方法是,将dest与某个插入迭代器或者ostream_iterator绑定在一起。插入迭代器在容器中加入元素,以确保容器有足够的空间存储输出。ostream_iterator则实现写输出流的功能,无须要考虑所写的元素个数。
2、带第二个输入序列的算法
有一些算法带有一个beg2迭代器形參,或者同一时候带有beg2和end2迭代器形參,来指定他的第二个输入范围,此时,算法完整地制定了两个范围:beg和end标记第一个输入范围,而beg2和end2则标记第二个输入范围。
与写入dest的算法一样,仅仅带有beg2的算法也假定一beg2開始的序列与beg和end标记的序列一样大!
二、算法的命名规范
标准库使用了两种重要的算法命名和重载规范:
1)第一种模式包含測试输入范围内的元素的算法
2)另外一种模式应用于对输入范围内元素又一次排序的算法【不是非常理解】
1、差别带有一个值或一个谓词函数參数的算法版本号
非常多算法通过检查其输入范围内的元素实现其功能。当中的大部分算法会提供第二个版本号的函数,同意程序猿提供比較或測试函数代替操作符(<或==)的使用。
sort(beg,end);
//带有一个额外的形參,表示用于元素排序的不同运算
sort(beg,end,comp);
检查指定值的算法默认使用==操作符。系统为这类算法提供另外命名的(而非重载的)版本号:
find(beg,end,val);
find_if(beg,end,pred);
带有谓词函数形參的算法,其名字带有一个_if后缀。当中,find_if算法用于查找一个使谓词函数pred返回非零值的元素。
2、差别是否实现复制的算法版本号
不管算法是否检查它的元素值,都可能又一次排列输入范围内的元素。在默认情况下,这些算法将又一次排列的元素写回其输入范围。标准库也为这些算法提供另外命名的版本号,将元素写到指定的输出目标。此版本号的算法在名字中加入了_copy后缀:
reverse(beg,end);
reverse_copy(beg,end,dest);
//P360 习题11.27
//仅仅依据这些函数的名字和形參,描写叙述这些算法的功能。
replace(beg, end, old_val, new_val);
replace_if(beg, end, pred, new_val);
replace_copy(beg, end, dest, old_val,new_val);
replace_copy_if(beg, end, dest, pred,new_val);
//习题11.28
int main()
{
list<int> iList;
for (list<int>::size_type i = 0; i != 100; ++i)
{
iList.push_back(i);
} vector<int> vec;
reverse_copy(iList.begin(),iList.end(),back_inserter(vec)); for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); ++iter)
{
cout << *iter << endl;
}
}
C++ Primer 学习笔记_45_STL实践与分析(19)--泛型算法的结构的更多相关文章
- C++ Primer 学习笔记_45_STL实践与分析(19)--建筑常规算法
STL实践与分析 --泛型算法的结构 引言: 正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础. 算法最主要的性质是须要使用的迭代器种类.全部算法都指定了它的每一个迭代器形參可使用 ...
- C++ Primer 学习笔记_41_STL实践与分析(15)--先来看看算法【下一个】
STL实践与分析 --初窥算法[下] 一.写容器元素的算法 一些算法写入元素值.在使用这些算法写元素时一定要当心.必须.写入输入序列的元素 写入到输入序列的算法本质上是安全的--仅仅会写入与指定输入范 ...
- C++ Primer 学习笔记_32_STL实践与分析(6) --再谈string类型(下)
STL实践与分析 --再谈string类型(下) 四.string类型的查找操作 string类型提供了6种查找函数,每种函数以不同形式的find命名.这些操作所有返回string::size_typ ...
- C++ Primer 学习笔记_35_STL实践与分析(9)--map种类(在)
STL实践与分析 --map类型(上) 引: map是键-值对的集合. map类型通常能够理解为关联数组:能够通过使用键作为下标来获取一个值,正如内置数组类型一样:而关联的本质在于元素的值与某个特定的 ...
- C++ Primer 学习笔记_43_STL实践与分析(17)--再谈迭代器【中】
STL实践与分析 --再谈迭代器[中] 二.iostream迭代[续] 3.ostream_iterator对象和ostream_iterator对象的使用 能够使用ostream_iterator对 ...
- C++ Primer 学习笔记_46_STL实践与分析(20)--容器特有的算法
STL实践与分析 --容器特有的算法 与其它顺序容器所支持的操作相比,标准库为list容器定义了更精细的操作集合,使它不必仅仅依赖于泛型操作.当中非常大的一个原因就是list容器不是依照内存中的顺序进 ...
- C++ Primer 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】
STL实践与分析 --再谈迭代器[下] 三.反向迭代器[续:习题] //P355 习题11.19 int main() { vector<int> iVec; for (vector< ...
- C++ Primer 学习笔记_40_STL实践与分析(14)--概要、先来看看算法【上】
STL实践与分析 --概述.初窥算法[上] 标准库容器定义的操作很少.并没有给容器加入大量的功能函数.而是选择提供一组算法,这些算法大都不依赖特定的容器类型,是"泛型"的. ...
- C++ Primer 学习笔记_33_STL实践与分析(7) --容器适配器
STL实践与分析 --容器适配器 引: 除了顺序容器.标准库还提供了三种顺序容器适配器:queue,priority_queue和stack.适配器是标准库中的概念.包含容器适配器,迭代器适配器和函数 ...
随机推荐
- 换算rem的宽度和高度不生效 chrome字体最小为12px
现在很多前端都用rem来单位元素和字体大小 一般的设置是 html{ font-size:62.5%; } 换算来源 1rem = 16px 10/16 = 0.625 这样10px 就等于了1rem ...
- SQL Server 2017搭建主从备份
SQL Server 2017搭建主从¶ 关于日志传输¶ 和Oracle DG,Mysql主从一样,SQL Server也支持主从的高可用.进一步提高数据的安全性和业务的高可用.通过将主库上的日志传输 ...
- ifconfig命令无法找到,提示bash: ifconfig: command not found
问题就是题目那样,具体解决方法截图如下: 分析问题 1.whereis ifconfig 看一下这个命令在哪个目录下 2.echo $PATH 看一下该目录是否在路经下,注意lunux下是完全区分大小 ...
- 简易的canvas画板
没事仿照windows画板工具用canvas实现了一个简易版的画板. html: <!doctype html> <html> <head> <meta ch ...
- Android Studio cannot resolve symbols
引入了第三方类库,不管怎么编译 clean 都找多到类库 关闭重新打开android studio就好了.....
- maven 安装与配置最佳实践
配置Maven环境变量 1.新建 maven home 环境变量 变量名:M2_HOME 变量值:D:\ProgramFiles\apache-maven-3.5.4 2 ...
- sql 内连接 子查询 合并查询
-- 内连接:-- 显示员工姓名.工资和公司所在地 select e.ename, e.sal, d.dname from emp e,dept d; -- 笛卡尔积 select e.ename, ...
- Object equals 方法
package com.mydemo.controller; public class TestEquals { public static void main(String[] args) { Do ...
- maven打包 springBoot 工程时,默认识别resources目录,习惯使用 resource 目录的需要手动指定静态资源目录
最近项目开发,发现springBoot项目在使用maven打包时,我们静态资源文件都放在resource目录下面,大致如下: 在使用maven打包时,发现静态资源没有打进去.原来springBoot默 ...
- JVM知识(二):类加载器原理
我们知道我们编写的java代码,会经过编译器编译成字节码(class文件),再把字节码文件装载到JVM中,最后映射到各个内存区域中,我们的程序就可以在内存中运行了.那么问题来了,这些字节码文件是怎么装 ...