C++ Primer 学习笔记_45_STL实践与分析(19)--泛型算法的结构
来源:互联网 发布:淘宝客怎么收费? 编辑:程序博客网 时间:2024/04/27 23:45
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.28int main(){ list iList; for (list::size_type i = 0; i != 100; ++i) { iList.push_back(i); } vector vec; reverse_copy(iList.begin(),iList.end(),back_inserter(vec)); for (vector::iterator iter = vec.begin(); iter != vec.end(); ++iter) { cout << *iter << endl; }}
- C++ Primer 学习笔记_45_STL实践与分析(19)--泛型算法的结构
- C++ Primer 学习笔记_46_STL实践与分析(20)--容器特有的算法
- C++ Primer 学习笔记_40_STL实践与分析(14)--概要、先来看看算法【上】
- C++ Primer 学习笔记_41_STL实践与分析(15)--先来看看算法【下一个】
- C++ Primer 学习笔记_30_STL实践与分析(4)
- C++ Primer 学习笔记_27_STL实践与分析(1) --顺序容器的定义、迭代器
- C++ Primer 学习笔记_27_STL实践与分析(1) --顺序容器的定义、迭代器
- C++ Primer 学习笔记_28_STL实践与分析(2) --顺序容器的操作(上)
- C++ Primer 学习笔记_29_STL实践与分析(3) --顺序容器的操作(下)
- C++Primer学习笔记(11)泛型算法
- C++ Primer 学习笔记_39_STL实践与分析(13)--multimap与multiset
- C++ Primer 学习笔记_38_STL实践与分析(12)--容器的综合应用:文本查询程序
- C++ Primer 学习笔记_31_STL实践与分析(5) --再谈string类型(上)
- C++ Primer 学习笔记_32_STL实践与分析(6) --再谈string类型(下)
- C++ Primer 学习笔记_35_STL实践与分析(9)--map种类(在)
- C++ Primer 学习笔记_33_STL实践与分析(7) --容器适配器
- C++ Primer 学习笔记_33_STL实践与分析(7) --容器适配器
- C++ Primer 学习笔记_34_STL实践与分析(8) --引言、pair类型、关联容器
- 安装Android Studio 中的 CUP虚拟化未开启错误
- 通过apperance设置的属性,必须得view加载完毕之后才能生效,我们可以强制刷新
- Django mtv思想
- 网络与通信:网络设备(概念)
- KVO和KVC的区别
- C++ Primer 学习笔记_45_STL实践与分析(19)--泛型算法的结构
- 图片变圆角--方式1不推荐
- sql server 分页/最近查询
- Oracle 11g Data Guard 之物理备库角色转换
- 重用UITableViewHeaderFooterView
- 转换控件的坐标系
- Android库. 1 SD卡操作
- 移动办公领域需求分析
- android中如何正确的设置view的多个tag值