泛型程序设计与C标准模板库.ppt

上传人:小飞机 文档编号:6305242 上传时间:2023-10-15 格式:PPT 页数:97 大小:436KB
返回 下载 相关 举报
泛型程序设计与C标准模板库.ppt_第1页
第1页 / 共97页
泛型程序设计与C标准模板库.ppt_第2页
第2页 / 共97页
泛型程序设计与C标准模板库.ppt_第3页
第3页 / 共97页
泛型程序设计与C标准模板库.ppt_第4页
第4页 / 共97页
泛型程序设计与C标准模板库.ppt_第5页
第5页 / 共97页
点击查看更多>>
资源描述

《泛型程序设计与C标准模板库.ppt》由会员分享,可在线阅读,更多相关《泛型程序设计与C标准模板库.ppt(97页珍藏版)》请在三一办公上搜索。

1、第十章 泛型程序设计 与C+标准模板库,清华大学 郑 莉,目录,10.1 泛型程序设计及STL的结构10.2 迭代器10.3 容器的基本功能与分类10.4 顺序容器10.5 关联容器10.6 函数对象10.7 算法10.8 综合实例对个人银行账户管理程序的改进10.9 深度探索10.10 小结,2,10.1.1 泛型程序设计的基本概念,编写不依赖于具体数据类型的程序将算法从特定的数据结构中抽象出来,成为通用的C+的模板为泛型程序设计奠定了关键的基础几个术语概念(concept):用来界定具备一定功能的数据类型,如“支持运算符”的数据类型构成Comparable这一概念;模型(model):符合

2、一个概念的数据类型称为该概念的模型,如int型是Comparable概念的模型。,3,10.1 泛型程序设计及STL的结构,10.1.2 STL简介,标准模板库(Standard Template Library,简称STL)提供了一些非常常用的数据结构和算法STL程序实例(例10-1):,4,10.1 泛型程序设计及STL的结构,/包含的头文件略去using namespace std;int main()const int N=5;vector s(N);for(int i=0;i si;transform(s.begin(),s.end(),ostream_iterator(cout,)

3、,negate();cout endl;return 0;,容器,函数对象,算法,STL的组成部分,5,STL是泛型程序设计的一个范例 容器(container)迭代器(iterator)算法(algorithms)函数对象(function object),10.1 泛型程序设计及STL的结构 10.1.2 STL简介,输入流迭代器和输出流迭代器,输入流迭代器istream_iterator以输入流(如cin)为参数构造可用*(p+)获得下一个输入的元素输出流迭代器ostream_iterator构造时需要提供输出流(如cout)可用(*p+)=x将x输出到输出流二者都属于适配器适配器是用来

4、为已有对象提供新的接口的对象输入流适配器和输出流适配器为流对象提供了迭代器的接口,6,10.2 迭代器,例10-2从标准输入读入几个实数,分别将它们的平方输出,/10_2.cpp#include#include#include using namespace std;/求平方的函数double square(double x)return x*x;int main()/从标准输入读入若干个实数,分别将它们的平方输出 transform(istream_iterator(cin),istream_iterator(),ostream_iterator(cout,t),square);cout e

5、ndl;return 0;,7,10.2 迭代器 输入流迭代器和输出流迭代器,10.2.2 迭代器的分类,8,10.2 迭代器,迭代器支持的操作,迭代器是泛化的指针,提供了类似指针的操作(诸如+、*、-运算符)输入迭代器可以用来从序列中读取数据,如输入流迭代器输出迭代器允许向序列中写入数据,如输出流迭代器前向迭代器既是输入迭代器又是输出迭代器,并且可以对序列进行单向的遍历双向迭代器与前向迭代器相似,但是在两个方向上都可以对数据遍历随机访问迭代器也是双向迭代器,但能够在序列中的任意两个位置之间进行跳转,如指针、使用vector的begin()、end()函数得到的迭代器,9,10.2 迭代器 1

6、0.2.2 迭代器的分类,10.2.3 迭代器的区间,两个迭代器表示一个区间:p1,p2)STL算法常以迭代器的区间作为输入,传递输入数据合法的区间p1经过n次(n 0)自增(+)操作后满足p1=p2区间包含p1,但不包含p2,10,10.2 迭代器,例10-3 综合运用几种迭代器的示例,/10_3.cpp#include#include#include#include using namespace std;/将来自输入迭代器p的n个T类型的数值排序,将结果通过输出迭代器result输出template void mySort(InputIterator first,InputIterato

7、r last,OutputIterator result)/通过输入迭代器p将输入数据存入向量容器s中vector s;for(;first!=last;+first)s.push_back(*first);sort(s.begin(),s.end();/对s进行排序,sort函数的参数必须是随机访问迭代器copy(s.begin(),s.end(),result);/将s序列通过输出迭代器输出,11,10.2 迭代器 10.2.3 迭代器的区间,例10-3(续),int main()/将s数组的内容排序后输出double a5=1.2,2.4,0.8,3.3,3.2;mySort(a,a+5

8、,ostream_iterator(cout,);cout(istream_iterator(cin),istream_iterator(),ostream_iterator(cout,);cout endl;return 0;,12,10.2 迭代器 10.2.3 迭代器的区间,运行结果:0.8 1.2 2.4 3.2 3.32-4 5 8-1 3 6-5-5-4-1 2 3 5 6 8,10.2.4 迭代器的辅助函数,advance(p,n)对p执行n次自增操作distance(first,last)计算两个迭代器first和last的距离,即对first执行多少次“+”操作后能够使得fi

9、rst=last,13,10.2 迭代器,10.3 容器的基本功能与分类,容器类是容纳、包含一组元素或元素集合的对象。七种基本容器:向量(vector)双端队列(deque)列表(list)集合(set)多重集合(multiset)映射(map)多重映射(multimap),14,10.3 容器的基本功能与分类(续),15,容器(Container),容器(Container),list,容器的通用功能,容器的通用功能用默认构造函数构造空容器支持关系运算符:=、!=、=begin()、end():获得容器首、尾迭代器clear():将容器清空empty():判断容器是否为空size():得到容

10、器元素个数s1.swap(s2):将s1和s2两容器内容交换相关数据类型(S表示容器类型)S:iterator:指向容器元素的迭代器类型S:const_iterator:常迭代器类型,16,10.3 容器的基本功能与分类,可逆容器、随机访问容器,可逆容器S:reverse_iterator:逆向迭代器类型S:const_reverse_iterator:逆向常迭代器类型rbegin():指向容器尾的逆向迭代器rend():指向容器首的逆向迭代器随机访问容器sn:获得容器s的第n个元素,17,10.3 容器的基本功能与分类,10.4.1 顺序容器的基本功能,顺序容器的接口赋值assign插入函数

11、insert,push_front(只对list和deque),push_back删除函数erase,clear,pop_front(只对list和deque),pop_back其他顺序容器访问函数front,back改变大小resize,18,10.4 顺序容器,例10-4 顺序容器的基本操作,/10_4.cpp,包含的头文件略去/输出指定的整型顺序容器的元素template void printContainer(const char*msg,const T,19,10.4 顺序容器 10.4.1 顺序容器的基本功能,例10-4(续),printContainer(deque at fir

12、st,s);/用s容器的内容的逆序构造列表容器llist l(s.rbegin(),s.rend();printContainer(list at first,l);/将列表容器l的每相邻两个容器顺序颠倒list:iterator iter=l.begin();while(iter!=l.end()int v=*iter;iter=l.erase(iter);l.insert(+iter,v);printContainer(list at last,l);/用列表容器l的内容给s赋值,将s输出s.assign(l.begin(),l.end();printContainer(deque at

13、last,s);return 0;,20,10.4 顺序容器 10.4.1 顺序容器的基本功能,例10-4(续),运行结果如下:0 9 8 6 4 3 2 1 5 4 deque at first:4 5 1 2 3 4 6 8 9 0 list at first:0 9 8 6 4 3 2 1 5 4 list at last:9 0 6 8 3 4 1 2 4 5 deque at last:9 0 6 8 3 4 1 2 4 5,21,10.4 顺序容器 10.4.1 顺序容器的基本功能,10.4.2 三种顺序容器的特性 向量(Vector),特点一个可以扩展的动态数组随机访问、在尾部插

14、入或删除元素快在中间或头部插入或删除元素慢向量的容量容量(capacity):实际分配空间的大小s.capacity():返回当前容量s.reserve(n):若容量小于n,则对s进行扩展,使其容量至少为n,22,10.4 顺序容器,双端队列(deque),特点在两端插入或删除元素快在中间插入或删除元素慢随机访问较快,但比向量容器慢,23,10.4 顺序容器 10.4.2 三种顺序容器的特性,例10-5 奇偶排序,先按照从大到小顺序输出奇数,再按照从小到大顺序输出偶数。,24,10.4 顺序容器 10.4.2 三种顺序容器的特性,/头部分省略int main()istream_iterator

15、 i1(cin),i2;/建立一对儿输入流迭代器 vector s1(i1,i2);/通过输入流迭代器从标准输入流中输入数据 sort(s1.begin(),s1.end();/将输入的整数排序 deque s2;/以下循环遍历s1 for(vector:iterator iter=s1.begin();iter!=s1.end();+iter)if(*iter%2=0)/偶数放到s2尾部 s2.push_back(*iter);else/奇数放到s2首部 s2.push_front(*iter);/将s2的结果输出 copy(s2.begin(),s2.end(),ostream_itera

16、tor(cout,);cout endl;return 0;,列表(list),特点在任意位置插入和删除元素都很快不支持随机访问接合(splice)操作s1.splice(p,s2,q1,q2):将s2中q1,q2)移动到s1中p所指向元素之前,25,10.4 顺序容器 10.4.2 三种顺序容器的特性,例10-6列表容器的splice操作,/头部分省略int main()string names1=Alice,Helen,Lucy,Susan;string names2=Bob,David,Levin,Mike;list s1(names1,names1+4);/用names1数组的内容构造

17、列表s1list s2(names2,names2+4);/用names2数组的内容构造列表s2/将s1的第一个元素放到s2的最后s2.splice(s2.end(),s1,s1.begin();list:iterator iter1=s1.begin();/iter1指向s1首advance(iter1,2);/iter1前进2个元素,它将指向s1第3个元素list:iterator iter2=s2.begin();/iter2指向s2首+iter2;/iter2前进1个元素,它将指向s2第2个元素,26,10.4 顺序容器 10.4.2 三种顺序容器的特性,例10-6(续),27,lis

18、t:iterator iter3=iter2;/用iter2初始化iter3 advance(iter3,2);/iter3前进2个元素,它将指向s2第4个元素/将iter2,iter3)范围内的结点接到s1中iter1指向的结点前 s1.splice(iter1,s2,iter2,iter3);/分别将s1和s2输出 copy(s1.begin(),s1.end(),ostream_iterator(cout,);cout(cout,);cout endl;return 0;,10.4 顺序容器 10.4.2 三种顺序容器的特性,运行结果:Helen Lucy David Levin Sus

19、anBob Mike Alice,三种顺序容器的比较,STL所提供的三种顺序容器各有所长也各有所短,我们在编写程序时应当根据我们对容器所需要执行的操作来决定选择哪一种容器。如果需要执行大量的随机访问操作,而且当扩展容器时只需要向容器尾部加入新的元素,就应当选择向量容器vector;如果需要少量的随机访问操作,需要在容器两端插入或删除元素,则应当选择双端队列容器deque;、如果不需要对容器进行随机访问,但是需要在中间位置插入或者删除元素,就应当选择列表容器list。,28,10.4 顺序容器 10.4.2 三种顺序容器的特性,10.4.3 顺序容器的插入迭代器,插入迭代器用于向容器头部、尾部或

20、中间指定位置插入元素的迭代器包括前插迭代器(front_inserter)、后插迭代器(back_insrter)和任意位置插入迭代器(inserter)例:list s;back_inserter iter(s);*(iter+)=5;/通过iter把5插入s末尾,29,10.4 顺序容器,10.4.4 顺序容器的适配器,以顺序容器为基础构建一些常用数据结构栈(stack):最先压入的元素最后被弹出队列(queue):最先压入的元素最先被弹出优先级队列(priority_queue):最“大”的元素最先被弹出,30,10.4 顺序容器,例10-7 利用栈反向输出单词,/10_7.cpp,省略

21、头部分int main()stack s;string str;cin str;/从键盘输入一个字符串/将字符串的每个元素顺序压入栈中for(string:iterator iter=str.begin();iter!=str.end();+iter)s.push(*iter);/将栈中的元素顺序弹出并输出while(!s.empty()cout s.top();s.pop();cout endl;return 0;,31,10.4 顺序容器 10.4.4 顺序容器的适配器,运行结果如下:congratulationssnoitalutargnoc,优先级队列,优先级队列也像栈和队列一样支持元

22、素的压入和弹出,但元素弹出的顺序与元素的大小有关,每次弹出的总是容器中最“大”的一个元素。template class priority_queue;例10-8 细胞分裂模拟一种细胞在诞生(即上次分裂)后会在500到2000秒内分裂为两个细胞,每个细胞又按照同样的规律继续分裂。,32,10.4 顺序容器 10.4.4 顺序容器的适配器,/10.8.cpp,头部分省略const int SPLIT_TIME_MIN=500;/细胞分裂最短时间const int SPLIT_TIME_MAX=2000;/细胞分裂最长时间class Cell;priority_queue cellQueue;cla

23、ss Cell/细胞类private:static int count;/细胞总数int id;/当前细胞编号int time;/细胞分裂时间public:Cell(int birth):id(count+)/birth为细胞诞生时间/初始化,确定细胞分裂时间time=birth+(rand()%(SPLIT_TIME_MAX-SPLIT_TIME_MIN)+SPLIT_TIME_MIN;int getId()const return id;/得到细胞编号int getSplitTime()const return time;/得到细胞分裂时间bool operator s.time;/定义“

24、”,33,例10-8(续),10.4 顺序容器 10.4.4 顺序容器的适配器,/细胞分裂void split()Cell child1(time),child2(time);/建立两个子细胞cout(time(0);int t;/模拟时间长度cout t;cellQueue.push(Cell(0);/将第一个细胞压入优先级队列while(cellQueue.top().getSplitTime()=t)cellQueue.top().split();/模拟下一个细胞的分裂cellQueue.pop();/将刚刚分裂的细胞弹出return 0;,34,例10-8(续),10.4 顺序容器 1

25、0.4.4 顺序容器的适配器,例10-8(续),运行结果如下:Simulation time:5000971s:Cell#0 splits to#1 and#21719s:Cell#1 splits to#3 and#41956s:Cell#2 splits to#5 and#62845s:Cell#6 splits to#7 and#83551s:Cell#3 splits to#9 and#103640s:Cell#4 splits to#11 and#123919s:Cell#5 splits to#13 and#144162s:Cell#10 splits to#15 and#1641

26、97s:Cell#8 splits to#17 and#184317s:Cell#7 splits to#19 and#204686s:Cell#13 splits to#21 and#224809s:Cell#12 splits to#23 and#244818s:Cell#17 splits to#25 and#26,35,10.4 顺序容器 10.4.4 顺序容器的适配器,10.5.1 关联容器分类和的基本功能,关联容器的特点每个关联容器都有一个键(key)可以根据键高效地查找元素接口插入:insert删除:erase查找:find定界:lower_bound、upper_bound、e

27、qual_range计数:count,36,10.5 关联容器,关联容器概念图,37,10.5 关联容器 10.5.1 关联容器的分类和基本功能,关联容器(Associative Container),关联容器(Associative Container),multiset,multimap,set,map,四种关联容器,单重关联容器(set和map)键值是唯一的,一个键值只能对应一个元素多重关联容器(multiset和multimap)键值是不唯一的,一个键值可以对应多个元素简单关联容器(set和multiset)容器只有一个类型参数,如set、multiset,表示键类型容器的元素就是键本

28、身二元关联容器(map和multimap)容器有两个类型参数,如map、multimap,分别表示键和附加数据的类型容器的元素类型是pair,即由键类型和元素类型复合而成的二元组,38,10.5 关联容器 10.5.1 关联容器的分类和基本功能,10.5.2 集合(set),集合用来存储一组无重复的元素。由于集合的元素本身是有序的,可以高效地查找指定元素,也可以方便地得到指定大小范围的元素在容器中所处的区间。例10-9 输入一串实数,将重复的去掉,取最大和最小者的中值,分别输出小于等于此中值和大于等于此中值的实数,39,10.5 关联容器,/10_9.cpp,头部分省略int main()se

29、t s;while(true)double v;cin v;if(v=0)break;/输入0表示结束pair:iterator,bool r=s.insert(v);/尝试将v插入if(!r.second)/如果v已存在,输出提示信息 cout:iterator iter1=s.begin();/得到第一个元素的迭代器set:iterator iter2=s.end();/得到末尾的迭代器double medium=(*iter1+*(-iter2)/2;/得到最小和最大元素的中值/输出小于或等于中值的元素cout(cout,);cout=medium:;copy(s.lower_bound

30、(medium),s.end(),ostream_iterator(cout,);cout endl;return 0;,40,10.5 关联容器 10.5.2 集合(set),例10-9(续),例10-9(续),运行结果如下:1 2.5 5 3.5 5 7 9 2.5 0 5 is duplicated 2.5 is duplicated=medium:5 7 9,41,10.5 关联容器 10.5.2 集合(set),10.5.3 映射(map),映射与集合同属于单重关联容器,它们的主要区别在于,集合的元素类型是键本身,而映射的元素类型是由键和附加数据所构成的二元组。在集合中按照键查找一个

31、元素时,一般只是用来确定这个元素是否存在,而在映射中按照键查找一个元素时,除了能确定它的存在性外,还可以得到相应的附加数据。例10-10 有五门课程,每门都有相应学分,从中选择三门,输出学分总和,42,10.5 关联容器,/10_10.cpp,头部分省略int main()map courses;/将课程信息插入courses映射中courses.insert(make_pair(CSAPP,3);courses.insert(make_pair(C+,2);courses.insert(make_pair(CSARCH,4);courses.insert(make_pair(COMPILER

32、,4);courses.insert(make_pair(OS,5);int n=3;/剩下的可选次数int sum=0;/学分总和while(n 0)string name;cin name;/输入课程名称map:iterator iter=courses.find(name);/查找课程if(iter=courses.end()/判断是否找到cout second;/累加学分courses.erase(iter);/将刚选过的课程从映射中删除n-;cout Total credit:sum endl;/输出总学分return 0;,43,10.5 关联容器 10.5.3 映射(map),例

33、10-10(续),例10-10(续),运行结果如下:C+COMPILERC+C+is not availableCSAPPTotal credit:9,44,10.5 关联容器 10.5.3 映射(map),例10-11统计一句话中每个字母出现的次数,/10_11.cpp,头部分省略int main()map s;/用来存储字母出现次数的映射char c;/存储输入字符do cin c;/输入下一个字符if(isalpha(c)/判断是否是字母c=tolower(c);/将字母转换为小写sc+;/将该字母的出现频率加1 while(c!=.);/碰到“.”则结束输入/输出每个字母出现次数for

34、(map:iterator iter=s.begin();iter!=s.end();+iter)cout first second;cout endl;return 0;,45,10.5 关联容器 10.5.3 映射(map),10.5.4 多重集合(multiset)与多重映射(multimap),多重集合是允许有重复元素的集合,多重映射是允许一个键对应多个附加数据的映射。多重集合与集合、多重映射与映射的用法差不多,只在几个成员函数上有细微差异,其差异主要表现在去除了键必须唯一的限制。例10-12 上课时间查询,46,10.5 关联容器,/10_12.cpp#include#include

35、#include#include using namespace std;int main()multimap courses;typedef multimap:iterator CourseIter;/将课程上课时间插入courses映射中courses.insert(make_pair(C+,2-6);courses.insert(make_pair(COMPILER,3-1);courses.insert(make_pair(COMPILER,5-2);courses.insert(make_pair(OS,1-2);courses.insert(make_pair(OS,4-1);co

36、urses.insert(make_pair(OS,5-5);/输入一个课程名,直到找到该课程为止,记下每周上课次数string name;int count;,47,10.5 关联容器 10.5.4 多重集合与多重映射,例10-12(续),do cin name;count=courses.count(name);if(count=0)cout range=courses.equal_range(name);for(CourseIter iter=range.first;iter!=range.second;+iter)cout second;cout endl;return 0;,48,1

37、0.5 关联容器 10.5.4 多重集合与多重映射,例10-12(续),运行结果如下:JAVACannot find this course!OS3 lesson(s)per week:1-2 4-1 5-5,10.6.1 函数对象,函数对象一个行为类似函数的对象可以没有参数,也可以带有若干参数其功能是获取一个值,或者改变操作的状态。例普通函数就是函数对象重载了“()”运算符的类的实例是函数对象,49,10.6 函数对象,函数对象概念图,50,10.6 函数对象 10.6.1 函数对象,函数对象(Function),一元函数对象(Unary Function),二元函数对象(Binary Fu

38、nction),产生器(Generator),一元谓词(Unary Predicate),二元谓词(Binary Predicate),例10-13、例10-14,使用两种方式定义表示乘法的函数对象通过定义普通函数(例10-13)通过重载类的“()”运算符(例10-14)用到以下算法:templateType accumulate(InputIterator first,InputIterator last,Type val,BinaryFunction binaryOp);对first,last)区间内的数据进行累“加”,binaryOp为用二元函数对象表示的“加”运算符,val为累“加”的

39、初值,51,10.6 函数对象 10.6.1 函数对象,#include#include/包含数值算法头文件using namespace std;/定义一个普通函数int mult(int x,int y)return x*y;int main()int a=1,2,3,4,5;const int N=sizeof(a)/sizeof(int);cout The result by multipling all elements in a is accumulate(a,a+N,1,mult)endl;return 0;,52,10.6 函数对象 10.6.1 函数对象,例10-13(续),

40、/10_14.cpp#include#include/包含数值算法头文件using namespace std;class MultClass/定义MultClass类public:int operator()(int x,int y)const return x*y;/重载操作符operator();int main()int a=1,2,3,4,5;const int N=sizeof(a)/sizeof(int);cout The result by multipling all elements in a is accumulate(a,a+N,1,MultClass()/将类mult

41、class传递给通用算法 endl;return 0;,53,10.6 函数对象 10.6.1 函数对象,例10-14(续),STL提供的函数对象,用于算术运算的函数对象:一元函数对象:negate二元函数对象:plus、minus、multiplies、divides、modulus用于关系运算、逻辑运算的函数对象一元谓词:logical_not二元谓词:equal_to、not_equal_to、greater、less、greater_equal、less_equal、logical_and、logical_or,54,10.6 函数对象 10.6.1 函数对象,例10-15 利用STL

42、标准函数对象,/10_15.cpp#include#include/包含数值算法头文件#include/包含标准函数对象头文件using namespace std;int main()int a=1,2,3,4,5;const int N=sizeof(a)/sizeof(int);cout()endl;/将标准函数对象传递给通用算法return 0;,55,10.6 函数对象 10.6.1 函数对象,例10-16利用STL中的二元谓词函数对象,/10_16.cpp,省略头部分int main()int intArr=30,90,10,40,70,50,20,80;const int N=s

43、izeof(intArr)/sizeof(int);vector a(intArr,intArr+N);cout(cout,t);cout();cout(cout,t);cout endl;return 0;,56,10.6 函数对象 10.6.1 函数对象,10.6.2 函数适配器,绑定适配器将n元函数对象的指定参数绑定为一个常数,得到n-1元函数对象:bind1st、bind2nd组合适配器将指定谓词的结果取反:not1、not2指针函数适配器对一般函数指针使用,使之能够作为其它函数适配器的输入:ptr_fun成员函数适配器对成员函数指针使用,把n元成员函数适配为n+1元函数对象,该函数对

44、象的第一个参数为调用该成员函数时的目的对象:ptr_fun、ptr_fun_ref,57,10.6 函数对象,例10-17 bind2nd产生binder2nd函数适配器实例,/10_17.cpp#include#include#include#includeusing namespace std;int main()int intArr=30,90,10,40,70,50,20,80;const int N=sizeof(intArr)/sizeof(int);vector a(intArr,intArr+N);vector:iterator p=find_if(a.begin(),a.en

45、d(),bind2nd(greater(),40);if(p=a.end()cout no element greater than 40 endl;elsecout first element greater than 40 is:*p endl;return 0;,58,10.6 函数对象 10.6.2 函数适配器,例10-18 ptr_fun、not1和not2产生函数适配器实例,/10_18.cpp,头部分省略bool g(int x,int y)return x y;int main()int intArr=30,90,10,40,70,50,20,80;const int N=si

46、zeof(intArr)/sizeof(int);vector a(intArr,intArr+N);vector:iterator p;p=find_if(a.begin(),a.end(),bind2nd(ptr_fun(g),40);if(p=a.end()cout no element greater than 40 endl;elsecout first element greater than 40 is:*p endl;,59,10.6 函数对象 10.6.2 函数适配器,60,10.6 函数对象 10.6.2 函数适配器,p=find_if(a.begin(),a.end(),

47、not1(bind2nd(greater(),15);if(p=a.end()cout(),15);if(p=a.end()cout no element is not greater than 15 endl;elsecout first element that is not greater than 15 is:*p endl;return 0;,例10-17(续),例10-19 成员函数适配器实例,/10_19.cpp#include#include#include#include using namespace std;struct Car int id;Car(int id)thi

48、s-id=id;void display()const cout pcars;vector cars;,61,10.6 函数对象 10.6.2 函数适配器,62,10.6 函数对象 10.6.2 函数适配器,for(int i=0;i 5;i+)pcars.push_back(new Car(i);for(int i=5;i 10;i+)cars.push_back(Car(i);cout elements in pcars:endl;for_each(pcars.begin(),pcars.end(),std:mem_fun(,例10-19(续),10.7.1 STL算法基础,STL算法本身

49、是一种函数模版通过迭代器获得输入数据通过函数对象对数据进行处理通过迭代器将结果输出STL算法是通用的,独立于具体的数据类型、容器类型STL算法分类不可变序列算法可变序列算法排序和搜索算法数值算法,63,10.7 算法,10.7.2 不可变序列算法,不可变序列算法不直接修改所操作的容器内容的算法用于查找指定元素、比较两个序列是否相等、对元素进行计数等例:templateInputIterator find_if(InputIterator first,InputIterator last,UnaryPredicate pred);用于查找first,last)区间内pred(x)为真的首个元素,

50、64,10.7 算法,例10-20 不可变序列算法应用实例,/10_20.cpp,头部分省略.int main()int iarray=0,1,2,3,4,5,6,6,6,7,8;vector ivector(iarray,iarray+sizeof(iarray)/sizeof(int);int iarray1=6,6;vector ivector1(iarray1,iarray1+sizeof(iarray1)/sizeof(int);int iarray2=5,6;vector ivector2(iarray2,iarray2+sizeof(iarray2)/sizeof(int);in

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号