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. 数据挖掘 决策树算法 ID3 通俗演绎

    决策树是对数据进行分类,以此达到预測的目的.该决策树方法先依据训练集数据形成决策树,假设该树不能对全部对象给出正确的分类,那么选择一些例外添�到训练集数据中,反复该过程一直到形成正确的决策集.决策树代 ...

  2. selenium2支持无界面操作(HtmlUnit和PhantomJs)

    selenium2支持无界面操作(HtmlUnit和PhantomJs) selenium2支持通过各种driver(FirfoxDriver,IternetExplorerDriver,OperaD ...

  3. ExtJs 设置GridPanel表格文本垂直居中

    业务场景,需要实现最终效果图如下: GridPanel代码如下配置: { xtype : 'grid', id : 'grid_jglb', frame : true, region : 'cente ...

  4. 你真的了解mysql的varchar字段的长度有多少吗?

    今天在设计系统字段的时候, 发现自己对varchar还不够了解.我设了一个字段.类型为VARCHER,然后我就往里面测试性了写了东西.发现没有多少就满了.我觉得奇怪,5.5版本以上的MYSQL不是有6 ...

  5. struts2第一个程序的详解(配图)

    首先我们在struts2中要写上一个action <packagename="fish"namespace="/test"extends="st ...

  6. shell命令批量杀死MySQL连接进程

    (1)将全部的MySQL连接进程杀掉 for i in `mysql -uroot -pzhangyun -Bse "show processlist" | grep -v &qu ...

  7. DOM解析XML文件实例

    XML文件: response: <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www ...

  8. android2.2应用开发之IccCard(sim卡或USIM卡)

    tyle="margin:20px 0px 0px; font-size:14px; line-height:26px; font-family:Arial; color:rgb(51,51 ...

  9. Unity3D开发一个2D横版射击游戏

    教程基于http://pixelnest.io/tutorials/2d-game-unity/ , 这个例子感觉还是比较经典的, 网上转载的也比较多. 刚好最近也在学习U3D, 做的过程中自己又修改 ...

  10. 从零開始学习OpenCL开发(一)架构

    多谢大家关注 转载本文请注明:http://blog.csdn.net/leonwei/article/details/8880012 本文将作为我<从零開始做OpenCL开发>系列文章的 ...