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)--泛型算法的结构的更多相关文章

  1. C++ Primer 学习笔记_45_STL实践与分析(19)--建筑常规算法

    STL实践与分析 --泛型算法的结构 引言: 正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础. 算法最主要的性质是须要使用的迭代器种类.全部算法都指定了它的每一个迭代器形參可使用 ...

  2. C++ Primer 学习笔记_41_STL实践与分析(15)--先来看看算法【下一个】

    STL实践与分析 --初窥算法[下] 一.写容器元素的算法 一些算法写入元素值.在使用这些算法写元素时一定要当心.必须.写入输入序列的元素 写入到输入序列的算法本质上是安全的--仅仅会写入与指定输入范 ...

  3. C++ Primer 学习笔记_32_STL实践与分析(6) --再谈string类型(下)

    STL实践与分析 --再谈string类型(下) 四.string类型的查找操作 string类型提供了6种查找函数,每种函数以不同形式的find命名.这些操作所有返回string::size_typ ...

  4. C++ Primer 学习笔记_35_STL实践与分析(9)--map种类(在)

    STL实践与分析 --map类型(上) 引: map是键-值对的集合. map类型通常能够理解为关联数组:能够通过使用键作为下标来获取一个值,正如内置数组类型一样:而关联的本质在于元素的值与某个特定的 ...

  5. C++ Primer 学习笔记_43_STL实践与分析(17)--再谈迭代器【中】

    STL实践与分析 --再谈迭代器[中] 二.iostream迭代[续] 3.ostream_iterator对象和ostream_iterator对象的使用 能够使用ostream_iterator对 ...

  6. C++ Primer 学习笔记_46_STL实践与分析(20)--容器特有的算法

    STL实践与分析 --容器特有的算法 与其它顺序容器所支持的操作相比,标准库为list容器定义了更精细的操作集合,使它不必仅仅依赖于泛型操作.当中非常大的一个原因就是list容器不是依照内存中的顺序进 ...

  7. C++ Primer 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】

    STL实践与分析 --再谈迭代器[下] 三.反向迭代器[续:习题] //P355 习题11.19 int main() { vector<int> iVec; for (vector< ...

  8. C++ Primer 学习笔记_40_STL实践与分析(14)--概要、先来看看算法【上】

    STL实践与分析 --概述.初窥算法[上]     标准库容器定义的操作很少.并没有给容器加入大量的功能函数.而是选择提供一组算法,这些算法大都不依赖特定的容器类型,是"泛型"的. ...

  9. C++ Primer 学习笔记_33_STL实践与分析(7) --容器适配器

    STL实践与分析 --容器适配器 引: 除了顺序容器.标准库还提供了三种顺序容器适配器:queue,priority_queue和stack.适配器是标准库中的概念.包含容器适配器,迭代器适配器和函数 ...

随机推荐

  1. drupal smtp could not connect to smtp

    情况说明: 使用了SMTP Authentication Support 模块. 配置都没问题,是从另一台服务器迁过来的网站和数据库. 原因是客户的smtp服务器限制了我们新服务器的IP. 验证方式t ...

  2. 【MUI框架】学习笔记整理 Day 2

    参考整理自MUI官网 http://dev.dcloud.net.cn/mui/ui/ (1)numbox(数字输入框) mui提供了数字输入框控件,可直接输入数字,也可以点击“+”.“-”按钮变换当 ...

  3. p2p手机绑定

    本文工具类     http://www.cnblogs.com/jokerq/p/8590498.html 1.需求分析 2.设计分析 3.前台页面(freemarker) <script t ...

  4. css清除浮动之天龙8步

    1.父级div定义height. 2.结尾处加空div标签clear:both. 3.父级div定义伪类:after和zoom. 4.父级div定义overflow:hidden. 5.父级div定义 ...

  5. Spring Boot—21Actuator--监控

    https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/reference/htmlsingle/ pom.xml <dependency&g ...

  6. CSS 几款比较常用的翻转特效

    第一个:360度翻转特效 <style>* { margin:0; padding:0; } .aa { width: 220px; height: 220px; margin: 0 au ...

  7. 润乾V5手机报表说明文档

    1.手机报表实例页面简要说明 index.jsp 是报表资源列表页面: mbReport.jsp 是报表展现页面: mbParam.jsp是参数报表展现页面: echarts.jsp是带有echart ...

  8. DBFlow(4.2)新版使用

    DBFlow新版使用 一.DBFlow4.2.4介绍 DBFlow是一个基于AnnotationProcessing(注解处理器)的ORM框架.此框架设计为了速度.性能和可用性.消除了大量死板的数据库 ...

  9. Storm默认配置 default.yaml

    default.yaml文件所在位置:apache-storm-0.9.4.tar.gz/apache-storm-0.9.4/lib/storm-core-0.94.jar/default.yaml ...

  10. Automate the Sizing of your SGA in Oracle 10g

    How much memory does each of the individual components of the SGA need? Oracle now has methods to de ...