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 学习笔记_46_STL实践与分析(20)--容器特有的算法

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

  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 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】

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

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

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

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

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

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

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

随机推荐

  1. wkhtmtopdf--高分辨率HTML转PDF(一)

    原文:wkhtmtopdf--高分辨率HTML转PDF(一) 一.需求 这次工作中遇到一个需求,要求把网页转换为PDF,穷极了很多的方法,包括尝试了itextsharp来转换,虽然可以实现,但是分辨率 ...

  2. 对称加密算法DES,3重DES,TDEA,Blowfish,RC5,IDEA,AES。

    对称加密算法:DES,3重DES,TDEA,Blowfish,RC5,IDEA,AES. 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文 ...

  3. 内存数据网格IMDG简单介绍

    1 简单介绍 将内存作为首要存储介质不是什么新奇事儿,我们身边有非常多主存数据库(IMDB或MMDB)的样例.在对主存的使用上.内存数据网格(In Memory Data Grid,IMDG)与IMD ...

  4. Linux共享wifi给Android手机

    亲測可行,測试系统:Deepin2014,Ubuntu也一样.步骤很easy. 1.卸载hostapd,sudo apt-get remove hostapd(假设原来装过的话卸载,由于某些版本号不支 ...

  5. UVA 10828 - Back to Kernighan-Ritchie(概率+高斯消元)

    UVA 10828 - Back to Kernighan-Ritchie 题目链接 题意:给图一个流程图,有结点的流程,每次进入下一个流程概率是均等的,有q次询问,求出每次询问结点的运行期望 思路: ...

  6. nginx.conf 文中描述的配置文件

    ###############################nginx.conf 件里文说明 #user nobody; # user 主模块指令,指令nginx worker 执行用户和用户组(u ...

  7. selenium webdriver缺陷

    关闭  selenium webdriver缺陷 除了http://573301735.com/?p=5126讲 的,昨天又发现一个让我1个小时生不如死的问题,就是使用两个不同的配置文件来初始化dri ...

  8. PHP实现队列(Queue)数据结构

    队列(Queue),是一种特殊的先进先出线性表,其只能在前端进行删除操作(一般称为出队),在后端进行插入操作(一般称为入队).进行删除操作的端称为队头,进行插入操作的端称为队尾.队列,是按照先进先出或 ...

  9. Knockout应用开发指南 第八章:简单应用举例(2)

    原文:Knockout应用开发指南 第八章:简单应用举例(2) 5   Control types 这个例子,对view model没有什么特殊的展示,只是展示如何绑定到各种元素上(例如,select ...

  10. notepad扩展搜索,正则搜索

    Dos和windows采用回车+换行CR/LF表示下一行, 0d 0a 两个字节表示而UNIX/Linux采用’\n’换行符LF表示下一行(ASCII代码是10),0a一个字节表示MAC OS系统则采 ...