c程序设计第七章类模板与向量.ppt

上传人:wuy****n92 文档编号:79027264 上传时间:2023-03-19 格式:PPT 页数:71 大小:429KB
返回 下载 相关 举报
c程序设计第七章类模板与向量.ppt_第1页
第1页 / 共71页
c程序设计第七章类模板与向量.ppt_第2页
第2页 / 共71页
点击查看更多>>
资源描述

《c程序设计第七章类模板与向量.ppt》由会员分享,可在线阅读,更多相关《c程序设计第七章类模板与向量.ppt(71页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第七章类模板与向量第七章类模板与向量本章考核要求:本章考核要求:本章考核要求:本章考核要求:1 1、理解、理解、理解、理解类模类模类模类模板板板板的概念,对比函数模版掌握类模的概念,对比函数模版掌握类模的概念,对比函数模版掌握类模的概念,对比函数模版掌握类模板板板板的的的的特点特点特点特点(对类的(对类的(对类的(对类的描述、简化程序设计),达到描述、简化程序设计),达到描述、简化程序设计),达到描述、简化程序设计),达到“领会领会领会领会”层次。层次。层次。层次。2 2、熟练掌握类模、熟练掌握类模、熟练掌握类模、熟练掌握类模板板板板的的的的成分以及语法成分以及语法成分以及语法成分以及语法,能

2、根据要求写出类模板,达,能根据要求写出类模板,达,能根据要求写出类模板,达,能根据要求写出类模板,达到到到到“综合应用综合应用综合应用综合应用”层次。层次。层次。层次。3 3、理解类模、理解类模、理解类模、理解类模板板板板的对象,了解类模的对象,了解类模的对象,了解类模的对象,了解类模板板板板的实例化,达到的实例化,达到的实例化,达到的实例化,达到“领会领会领会领会”层次。层次。层次。层次。4 4、掌握在、掌握在、掌握在、掌握在类体外定义成员函数类体外定义成员函数类体外定义成员函数类体外定义成员函数的一般格式的一般格式的一般格式的一般格式,达到达到达到达到“简单应用简单应用简单应用简单应用”层

3、次。层次。层次。层次。5 5、了解、了解、了解、了解类模类模类模类模板板板板的派生与继承的派生与继承的派生与继承的派生与继承,理解模,理解模,理解模,理解模板板板板类集成非模板和从类模类集成非模板和从类模类集成非模板和从类模类集成非模板和从类模板板板板派生一个类模版两种情况,最终达到派生一个类模版两种情况,最终达到派生一个类模版两种情况,最终达到派生一个类模版两种情况,最终达到“领会领会领会领会”层次。层次。层次。层次。6 6、理解、理解、理解、理解向量向量向量向量的概念,会的概念,会的概念,会的概念,会定义向量列表定义向量列表定义向量列表定义向量列表,达到,达到,达到,达到”领会领会领会领会

4、“层次。层次。层次。层次。7 7、掌握定义向量使用的基本数据类型,达到、掌握定义向量使用的基本数据类型,达到、掌握定义向量使用的基本数据类型,达到、掌握定义向量使用的基本数据类型,达到“简单应用简单应用简单应用简单应用”层次。层次。层次。层次。对构造类型一般性了解,达到对构造类型一般性了解,达到对构造类型一般性了解,达到对构造类型一般性了解,达到“识记识记识记识记”层次。层次。层次。层次。8 8、掌握向量容器指定位置、掌握向量容器指定位置、掌握向量容器指定位置、掌握向量容器指定位置插入和删除插入和删除插入和删除插入和删除对象的方法,达到对象的方法,达到对象的方法,达到对象的方法,达到“简单应简

5、单应简单应简单应用用用用”层次。层次。层次。层次。9 9、了解向量其他的操作方法,达到、了解向量其他的操作方法,达到、了解向量其他的操作方法,达到、了解向量其他的操作方法,达到“识记识记识记识记”层次。层次。层次。层次。1相关知识回顾相关知识回顾1、函数的重载、函数的重载 函数重载可以使一个函数名具有多种功能,即具有多种形函数重载可以使一个函数名具有多种功能,即具有多种形态,称这种特性为态,称这种特性为 。多态性多态性 当函数的参数当函数的参数 不同,或者参数不同,或者参数 不同时,不同时,函数可以重载。仅有函数返回值不同函数可以重载。仅有函数返回值不同 区分重载函数。区分重载函数。类型类型个

6、数个数不能不能 有些函数重载时参数有些函数重载时参数有些函数重载时参数有些函数重载时参数个数相同个数相同个数相同个数相同,只是,只是,只是,只是类型不同类型不同类型不同类型不同,此时重,此时重,此时重,此时重载函数比较繁琐,可利用载函数比较繁琐,可利用载函数比较繁琐,可利用载函数比较繁琐,可利用 实现。实现。实现。实现。函数模板函数模板函数模板函数模板22、函数模板、函数模板 c+规定模板以规定模板以 关键字和一个形参关键字和一个形参表开头。表开头。template 将函数模板与某个具体数据类型连用,就产生了将函数模板与某个具体数据类型连用,就产生了 ,又称这个过程为函数模板实例化,这种形式就

7、是类型参数化。,又称这个过程为函数模板实例化,这种形式就是类型参数化。模板函数模板函数例如:例如:T max(T a,T b)if(ab)return a;else return b;template 另外,另外,c+还专门定义了一个还专门定义了一个仅仅用在模板中的关键字仅仅用在模板中的关键字 ,它的用途之一是,它的用途之一是代替代替template参数列表中的参数列表中的关键字关键字class。typename函数执行时确定参数类型的函数称为模板函数。函数执行时确定参数类型的函数称为模板函数。函数执行时确定参数类型的函数称为模板函数。函数执行时确定参数类型的函数称为模板函数。32、函数模板、

8、函数模板 函数模板是不能直接执行的,需要实例化为模板函数后才函数模板是不能直接执行的,需要实例化为模板函数后才能执行。能执行。使用格式:使用格式:模板函数名模板函数名 (实参表实参表)(显式比较准则)(显式比较准则)或者:或者:模板函数名模板函数名(实参表实参表)(默认方式)(默认方式)4如有函数模板如下:如有函数模板如下:template T max(T a,T b)if(ab)return a;else return b;m1=max(3,8);m2=max(3.6,12.5);m3=max(a,A);m1=max(3,8);m2=max(3.6,12.5);m3=max(a,A);或者或

9、者则对该函数模板的使用有:则对该函数模板的使用有:注:要想省去显式调用的麻烦,注:要想省去显式调用的麻烦,条件是由这个调用的函数参数条件是由这个调用的函数参数表能够惟一地去标识出模板参表能够惟一地去标识出模板参数的一个集合。数的一个集合。在调用函数模板时,在调用函数模板时,的类型决定到底使用的类型决定到底使用模板的哪个版本。也就是说,模板的参数是由模板的哪个版本。也就是说,模板的参数是由 的参数的参数推断出来的。推断出来的。函数参数函数参数函数函数5class PointIntint x,y;public:PointInt(int a=0,int b=0):x(a),y(b)void setx

10、y(int a,int b)x=a;y=b;void showxy()coutx,yendl;int getx()return x;int gety()return y;class PointFloatfloat x,y;public:PointFloat(float a=0,float b=0):x(a),y(b)void setxy(float a,float b)x=a;y=b;void showxy()coutx,yendl;float getx()return x;float gety()return y;void main()PointInt a(3,4);a.showxy();P

11、ointFloat b(1.2,3.4);b.showxy();分析以下程序的结果分析以下程序的结果(lt7_1a.cpp)6class PointIntint x,y;public:PointInt(int a=0,int b=0):x(a),y(b)void setxy(int a,int b)x=a;y=b;void showxy()coutx,yendl;int getx()return x;int gety()return y;class PointFloatfloat x,y;public:PointFloat(float a=0,float b=0):x(a),y(b)void

12、setxy(float a,float b)x=a;y=b;void showxy()coutx,yendl;float getx()return x;float gety()return y;分析以下程序的结果分析以下程序的结果(lt7_1a.cpp)分析分析PointInt类和类和PointFloat类的类的异同?异同?类中的数据成员类中的数据成员以及实现的操作以及实现的操作相同,只是相同,只是数据数据类型不同。类型不同。为了避免因为类的数为了避免因为类的数据类型不同而产生的据类型不同而产生的重复性设计,可以将重复性设计,可以将这些数据类型从类中这些数据类型从类中分离出来形成一个通分离出来

13、形成一个通用的数据类型用的数据类型T,为,为这个数据类型这个数据类型T设计设计一个操作集,就是一个操作集,就是类类模板模板 T TT T T T TTTTTTTT7将数据类型抽象出来而形成的操作集:将数据类型抽象出来而形成的操作集:class PointT x,y;public:Point(T a=0,T b=0):x(a),y(b)void setxy(T a,T b)x=a;y=b;void showxy()coutx,yendl;T getx()return x;T gety()return y;87.17.1类模板类模板 类模板使用户可以为类定义一种模式,使得类中的某些数类模板使用户可

14、以为类定义一种模式,使得类中的某些数据成员、成员函数的参数和返回值能取得任意数据类型。据成员、成员函数的参数和返回值能取得任意数据类型。类模板用于实现类所需数据的类模板用于实现类所需数据的类型参数化类型参数化。所以。所以类模板也类模板也称为参数化类称为参数化类。9一、类模板基础知识一、类模板基础知识1、类模板声明的一般格式:、类模板声明的一般格式:template class 类名类名 类体类体;class PointT x,y;public:Point(T a=0,T b=0):x(a),y(b)void setxy(T a,T b)x=a;y=b;void showxy()coutx,ye

15、ndl;T getx()return x;T gety()return y;template 例如:例如:模版以模版以template关关键字和一个形参表键字和一个形参表开头。开头。10void setxy(T a,T b)x=a;y=b;Point :template class PointT x,y;public:Point(T a=0,T b=0):x(a),y(b)void setxy(T a,T b)x=a;y=b;void showxy()coutx,yendl;T getx()return x;T gety()return y;void setxy(T a,T b)x=a;y=b

16、;void setxy(T,T);template 注:在类体外面定义成员函注:在类体外面定义成员函数时,必须用数时,必须用template重写重写类模板声明类模板声明!11注:在类体外面定义成员函数时,必须用注:在类体外面定义成员函数时,必须用template重写类模板声重写类模板声明明!(P148)一般格式为:一般格式为:template 返回类型返回类型 类名类名:成员函数名成员函数名(函数参数列表函数参数列表)函数体函数体指指template的的内使用内使用class(或或typename)声明的类型参数。声明的类型参数。如上例中的:如上例中的:template void Point:

17、setxy(T a,T b)x=a;y=b;122 2、类模板对象、类模板对象 类模板不能直接使用,必须先实例化为相应的模板类,定类模板不能直接使用,必须先实例化为相应的模板类,定义该模板类的对象后才能使用。义该模板类的对象后才能使用。初始化类模板时,只要传给它指定的数据类型初始化类模板时,只要传给它指定的数据类型(如如int,float,double等等),编译器就用指定的类型代替模板参数产生相应的编译器就用指定的类型代替模板参数产生相应的模板类模板类。用类模板定义对象的一般格式:用类模板定义对象的一般格式:类名类名 对象名对象名(构造函数实参列表构造函数实参列表)或者:或者:类名类名 对象

18、名对象名 编译器不能从构造函编译器不能从构造函数参数列表推断出模数参数列表推断出模板实例化参数类型,板实例化参数类型,所以所以必须显式地给出必须显式地给出对象的参数类型对象的参数类型13例如:例如:template class PointT x,y;public:Point(T a=0,T b=0):x(a),y(b)void setxy(T a,T b)x=a;y=b;void showxy()coutx,yendl;T getx()return x;T gety()return y;void main()Point a(3,4);a.showxy();Point b(1.2,3.4);b.

19、showxy();显式地给显式地给出对象的出对象的参数类型参数类型14例题:分析以下程序结果例题:分析以下程序结果(lt7_3.cpp)#include using namespace std;template class sumT msize;public:sum(T a=0,T b=0,T c=0,T d=0)m0=a;m1=b;m2=c;m3=d;T s()T add=0;for(int i=0;isize;i+)add+=mi;return add;void main()sum x(1,2,3,4);sum y(a,1,-32,1);sum z(1.2,2.3,3.4,4.5);cou

20、tx.s()endl;couty.s()endl;coutz.s()endl;15二、类模板的派生与继承二、类模板的派生与继承二、类模板的派生与继承二、类模板的派生与继承 类模板也可以继承。声明模板继承之前,必须类模板也可以继承。声明模板继承之前,必须重新声明类重新声明类模板模板。模板类的基类和派生类都可以是模板类或者非模板类,。模板类的基类和派生类都可以是模板类或者非模板类,本节只介绍其中两种情况:本节只介绍其中两种情况:1 1、从非模板类派生类模板、从非模板类派生类模板、从非模板类派生类模板、从非模板类派生类模板16class Point /非模板类非模板类protected:int x,

21、y;public:Point(int a=0,int b=0):x(a),y(b)void showxy()coutx,yendl;template /从非模板类派生类模板从非模板类派生类模板class Line:public Point T x2,y2;public:Line(int a,int b,T c,T d):Point(a,b)x2=c;y2=d;void setline(int a,int b,T c,T d)x=a;y=b;x2=c;y2=d;void showLine()coutPoint1坐标坐标:;showxy();coutPoint2坐标坐标:;coutx2,y2end

22、l;T length()return sqrt(x2-x)*(x2-x)+(y2-y)*(y2-y);void main()Line a(1,1,1,3);a.showLine();couta线段长度:线段长度:a.length()endl;Line b(1,1,1.0,5.8);coutb线段长度:线段长度:b.length()endl;172 2,从类模板派生一个类模板,从类模板派生一个类模板,从类模板派生一个类模板,从类模板派生一个类模板 类模板使用时,须指出类模板的参数类模板使用时,须指出类模板的参数类模板使用时,须指出类模板的参数类模板使用时,须指出类模板的参数给出类模板参数后得到一

23、个模板类给出类模板参数后得到一个模板类给出类模板参数后得到一个模板类给出类模板参数后得到一个模板类继承后成员的访问权限变化同一般类的继承继承后成员的访问权限变化同一般类的继承继承后成员的访问权限变化同一般类的继承继承后成员的访问权限变化同一般类的继承18class Point /非模板类非模板类protected:int x,y;public:Point(int a=0,int b=0):x(a),y(b)void showxy()coutx,yendl;template /从非模板类派生类模板从非模板类派生类模板class Line:public Point T x2,y2;public:L

24、ine(int a,int b,T c,T d):Point (a,b)x2=c;y2=d;void setline(int a,int b,T c,T d)x=a;y=b;x2=c;y2=d;void showLine()coutPoint1坐标坐标:;showxy();coutPoint2坐标坐标:;coutx2,y2endl;T length()return sqrt(x2-x)*(x2-x)+(y2-y)*(y2-y);template TTT/类模板类模板/从类模板派生类模板从类模板派生类模板void main()Point a(3.5,6.8);a.showxy();Lineab(

25、4,5,6,7);ab.showLine();coutab线段长度线段长度:ab.length()endl;Lineac(1.5,2.5,4.5,6.5);ac.showLine();coutac线段长度线段长度:ac.length()endl;19类模板总结类模板总结类模板的定义格式类模板的定义格式类模板的成员函数定义在类体外时注意事项类模板的成员函数定义在类体外时注意事项类模板如何产生一个模板类并定义对象类模板如何产生一个模板类并定义对象类模板与函数模板不同之处:类模板与函数模板不同之处:类模板无法从构造函数的参数中判断出类模板无法从构造函数的参数中判断出T的类型,的类型,必须显式给出模板

26、的参数。必须显式给出模板的参数。类模板的派生类模板的派生类模板继承普通类,类模板继承普通类,类模板派生类模板类模板派生类模板20课程回顾课程回顾1.如果一个模板声明列出多个参数,则多个参数之间必须使如果一个模板声明列出多个参数,则多个参数之间必须使用逗号隔开,每个参数都必须重复使用关键字用逗号隔开,每个参数都必须重复使用关键字_ _。classs21数组:数组:数组:数组:用于存放用于存放用于存放用于存放相同类型相同类型相同类型相同类型的数据;的数据;的数据;的数据;通过通过通过通过数组元素数组元素数组元素数组元素使用;使用;使用;使用;数组一旦定义,其大小即固定不变;数组一旦定义,其大小即固

27、定不变;数组一旦定义,其大小即固定不变;数组一旦定义,其大小即固定不变;可使用泛型算法。可使用泛型算法。可使用泛型算法。可使用泛型算法。7.27.2向量与泛型算法向量与泛型算法 向量是向量是向量是向量是C+C+中一维数组的类版本,它与数组相似,其中一维数组的类版本,它与数组相似,其中一维数组的类版本,它与数组相似,其中一维数组的类版本,它与数组相似,其中的中的中的中的元素是连续存储元素是连续存储元素是连续存储元素是连续存储的,不同的是:向量中存储元素的多的,不同的是:向量中存储元素的多的,不同的是:向量中存储元素的多的,不同的是:向量中存储元素的多少可以在运行中少可以在运行中少可以在运行中少可

28、以在运行中根据需要动态地增长或缩小根据需要动态地增长或缩小根据需要动态地增长或缩小根据需要动态地增长或缩小。向量:向量:向量:向量:用于存放多个用于存放多个用于存放多个用于存放多个相同类型相同类型相同类型相同类型的数据;的数据;的数据;的数据;利用利用利用利用对象对象对象对象使用;使用;使用;使用;可可可可动态动态动态动态指定向量中元素的个数;指定向量中元素的个数;指定向量中元素的个数;指定向量中元素的个数;提供了多个提供了多个提供了多个提供了多个成员函数成员函数成员函数成员函数以方便数据使用;以方便数据使用;以方便数据使用;以方便数据使用;可使用泛型算法。可使用泛型算法。可使用泛型算法。可使

29、用泛型算法。22一、定义向量列表一、定义向量列表一、定义向量列表一、定义向量列表是是是是C+C+中的类模板。使用时加头文件中的类模板。使用时加头文件中的类模板。使用时加头文件中的类模板。使用时加头文件vectorvector。向量的声明形式:向量的声明形式:向量的声明形式:向量的声明形式:(以下形式中(以下形式中(以下形式中(以下形式中lengthlength表示长度,表示长度,表示长度,表示长度,typetype表示类型,表示类型,表示类型,表示类型,namename表表表表示向量对象名)示向量对象名)示向量对象名)示向量对象名)1 1)vector namevector name;/定义定

30、义定义定义typetype的向量空表,没有元素的向量空表,没有元素的向量空表,没有元素的向量空表,没有元素2 2)vector name(length)vector name(length);/定义具有定义具有定义具有定义具有lenghlengh个个个个typetype的向量的向量的向量的向量,元素初始化为元素初始化为元素初始化为元素初始化为0 03 3)vector name(length,n)vector name(length,n);/定义具有定义具有定义具有定义具有lenghlengh个个个个typetype的向量的向量的向量的向量,元素初始化为元素初始化为元素初始化为元素初始化为n

31、n4 4)vector name(name1)vector name(name1);/使用已定义的向量使用已定义的向量使用已定义的向量使用已定义的向量name1name1构造向量构造向量构造向量构造向量namename5 5)vector name(a,a+vector name(a,a+长度长度长度长度);/将已经定义好的数组将已经定义好的数组将已经定义好的数组将已经定义好的数组a a的内容复制给向量的内容复制给向量的内容复制给向量的内容复制给向量23向量的定义形式:向量的定义形式:向量的定义形式:向量的定义形式:1 1)vector namevector name;2 2)vector n

32、ame(length)vector name(length);3 3)vector name(length,n)vector name(length,n);4 4)vector name(name1)vector name(name1);5 5)vector name(a,a+length)vector name(a,a+length);例题:例题:1)定义字符型空向量定义字符型空向量A2)定义定义5个个int型向量型向量B,元素初始化为元素初始化为03)定义定义10个个int型向量型向量C,元素初始化为元素初始化为3vectorA;vectorB(5);vectorC(10,3);4)用向量

33、用向量C构造向量构造向量DvectorD(C);5)定义定义5个字符型向量个字符型向量E,并初始化为并初始化为aD=BvectorE(5,a);6)将将B赋值给赋值给D同类型的向量可以相互赋值,而不管它们的长度如何。向量可以改同类型的向量可以相互赋值,而不管它们的长度如何。向量可以改变赋值目标的大小,使它的元素数目与赋值源的元素数目相同。变赋值目标的大小,使它的元素数目与赋值源的元素数目相同。24向量的定义形式:向量的定义形式:向量的定义形式:向量的定义形式:1 1)vector namevector name;2 2)vector name(length)vector name(length

34、);3 3)vector name(length,n)vector name(length,n);4 4)vector name(name1)vector name(name1);5 5)vector name(a,a+length)vector name(a,a+length);例题:例题:7)若已有数组定义如下:若已有数组定义如下:int a5=1,2,3,4,5;则:把数组中的全部元素复制到向量则:把数组中的全部元素复制到向量F中中vectorF(a,a+5);25向量的声明形式:向量的声明形式:26向量的使用:向量的使用:由由由由vectorvector定义的对象定义的对象定义的对象定

35、义的对象C+C+中称为向量中称为向量中称为向量中称为向量同类型向量可相互赋值,不同类型不可相互赋值同类型向量可相互赋值,不同类型不可相互赋值同类型向量可相互赋值,不同类型不可相互赋值同类型向量可相互赋值,不同类型不可相互赋值同类向量长度不同也可相互赋值同类向量长度不同也可相互赋值同类向量长度不同也可相互赋值同类向量长度不同也可相互赋值向量中的元素使用类似数组元素向量中的元素使用类似数组元素向量中的元素使用类似数组元素向量中的元素使用类似数组元素,可使用可使用可使用可使用向量名向量名向量名向量名 下标下标下标下标 向量具有成员函数向量具有成员函数向量具有成员函数向量具有成员函数size()siz

36、e()可得到向量长度可得到向量长度可得到向量长度可得到向量长度27例题:补全程序并分析程序结果例题:补全程序并分析程序结果(lt7_6a.cpp)#include#include using namespace std;void main()int a=1,2,3,4,5;vectorF(a,a+3);cout有有F.size()个元素,分别为:个元素,分别为:endl;for(int i=0;iF.size();i+)coutFi;coutendl;向量具有成员函数向量具有成员函数向量具有成员函数向量具有成员函数sizesize()可得到向量长()可得到向量长()可得到向量长()可得到向量长

37、度度度度向量中的元素使向量中的元素使向量中的元素使向量中的元素使用类似数组元素,用类似数组元素,用类似数组元素,用类似数组元素,可使用向量名可使用向量名可使用向量名可使用向量名 下标下标下标下标 的形式的形式的形式的形式28向量的使用向量的使用(分析以下程序段得结果)(分析以下程序段得结果)29二、泛型指针二、泛型指针二、泛型指针二、泛型指针与操作对象的数据类型相互独立的算法称为与操作对象的数据类型相互独立的算法称为 。泛型算法泛型算法1 1 1 1、向量成员函数、向量成员函数、向量成员函数、向量成员函数begin()begin()begin()begin(),end()end()end()e

38、nd(),rbegin()rbegin()rbegin()rbegin(),rend()rend()rend()rend()其含义为其含义为其含义为其含义为:begin()begin()表示向量中首元素的地址表示向量中首元素的地址表示向量中首元素的地址表示向量中首元素的地址end()end()表示最后一个元素的下一个地址表示最后一个元素的下一个地址表示最后一个元素的下一个地址表示最后一个元素的下一个地址rbegin()rbegin()表示向量中最后一个元素的地址表示向量中最后一个元素的地址表示向量中最后一个元素的地址表示向量中最后一个元素的地址rend()rend()表示首元素的前一个地址表示

39、首元素的前一个地址表示首元素的前一个地址表示首元素的前一个地址若有:若有:若有:若有:int x=1,2,3,4,5;vector a(x,x+5)int x=1,2,3,4,5;vector a(x,x+5);12345a.begin()a.end()a.rbegin()a.rend()30特别注意特别注意向量的成员函数向量的成员函数begin()+1 表示表示下一个下一个地址地址end()-1 表示表示前一个前一个地址地址rbegin()+1 表示表示前一个前一个地址地址rend()-1 表示表示下一个下一个地址地址31例题:用例题:用begin(),end(),rbegin(),rend

40、()函数输出向量元素。函数输出向量元素。(lt7_6b.c),按要求填空,按要求填空#include#include using namespace std;void main()int a=1,2,3,4,5;vectorF(a,a+5);cout向量向量F有有 F.size()个元素,分别为:个元素,分别为:endl;for(int i=0;i F.size();i+)/正向输出向量中的正向输出向量中的元素元素 cout*(F.begin()+i);coutendl;输出向量元输出向量元素的个数素的个数32若有向量定义:若有向量定义:vector F(a,a+5)for(int i=0;i

41、 F.size();i+)/正向输出向量中的元素正向输出向量中的元素 cout*(F.begin()+i);coutendlfor(int i=0;i F.size();i+)/正向输出向量中的元素正向输出向量中的元素 cout*(F.rend()-i-1);coutendlfor(int i=0;i F.size();i+)/逆向输出向量中的元素逆向输出向量中的元素 cout*(F.end()-1-i);coutendlfor(int i=0;i F.size();i+)/逆向输出向量中的元素逆向输出向量中的元素 cout*(F.rbegin()+i);coutendl332、利用普通指针指

42、向向量元素、利用普通指针指向向量元素向量成员函数向量成员函数向量成员函数向量成员函数begin(),end(),rbegin(),rend()begin(),end(),rbegin(),rend()begin(),end(),rbegin(),rend()begin(),end(),rbegin(),rend()可以取得向量中某个元素地址可以取得向量中某个元素地址可以取得向量中某个元素地址可以取得向量中某个元素地址指针可以存放地址指针可以存放地址指针可以存放地址指针可以存放地址用指针可以指向用指针可以指向向量中的元素向量中的元素注意:指针类型必须同要指向的数据类型一致注意:指针类型必须同要指

43、向的数据类型一致注意:指针类型必须同要指向的数据类型一致注意:指针类型必须同要指向的数据类型一致如有:如有:如有:如有:vector v(10,1);vector v(10,1);int*p;int*p;则:则:则:则:p=v.begin();p=v.begin();/指针指针指针指针p p指向了指向了指向了指向了v v中的首元素中的首元素中的首元素中的首元素若使若使p指向尾元素可使用语句:指向尾元素可使用语句:p=v.end()-1;注意:只能用正向指针来赋值,而不能用逆向指针赋值。注意:只能用正向指针来赋值,而不能用逆向指针赋值。如如:p=v.rbegin()或者或者 p=rend()都是

44、错误的。都是错误的。34例题:用普通指针输出向量元素例题:用普通指针输出向量元素(lt7_6c.cpp)若有向量定义:若有向量定义:int a=1,2,3,4,5;vector v(a,a+5);int*p;for(p=v.begin();pv.end();p+)/正向输出向量中的元素正向输出向量中的元素 cout*p ;cout=v.begin();p-)/逆向输出向量中的元逆向输出向量中的元素素 cout*p ;coutendl;353、泛型指针、泛型指针类模板类模板类模板类模板vectorvector中提供了一个通用指针中提供了一个通用指针中提供了一个通用指针中提供了一个通用指针iter

45、atoriterator,如果用如果用如果用如果用T T表示向量的参数化数据类型,表示向量的参数化数据类型,表示向量的参数化数据类型,表示向量的参数化数据类型,iteratoriterator相当于相当于相当于相当于T*T*。注意:泛型指针是使用注意:泛型指针是使用注意:泛型指针是使用注意:泛型指针是使用类类类类实现的实现的实现的实现的 该指针可指向向量中的元素该指针可指向向量中的元素该指针可指向向量中的元素该指针可指向向量中的元素 可使用可使用可使用可使用*p*p表示它指向的元素值表示它指向的元素值表示它指向的元素值表示它指向的元素值 只能用只能用只能用只能用正向正向正向正向指针给指针给指针

46、给指针给p p赋值,如赋值,如赋值,如赋值,如beginbegin()、()、()、()、endend()。()。()。()。1 1)用)用)用)用iteratoriterator声明声明声明声明正向正向正向正向泛型指针的形式:泛型指针的形式:泛型指针的形式:泛型指针的形式:vector:iterator vector:iterator 指针名指针名指针名指针名例如:例如:vector:iterator p;表示定义了一个指向表示定义了一个指向int型向量的指针型向量的指针p36用用用用iteratoriterator声明声明声明声明正向正向正向正向泛型指针的形式:泛型指针的形式:泛型指针的形

47、式:泛型指针的形式:vector:iterator vector:iterator 指针名指针名指针名指针名例题:如有向量定义例题:如有向量定义vector v(5,9);则:则:定义一个可以指向向量定义一个可以指向向量v的指针的指针p应使用语句:应使用语句:vector:iterator p;使使p指向向量指向向量v的首元素,可使用语句:的首元素,可使用语句:p=v.begin();for(int i=0;iv.size();i+)/正向输出向量中的元素正向输出向量中的元素 cout *(p+i)=v.begin;p-)/逆向输出向量中的元素逆向输出向量中的元素 cout *p ;37练习:

48、补全程序并分析运行结果练习:补全程序并分析运行结果(lt7_6d.cpp)#include#include#includeusing namespace std;void main()char s=happy;vectorv(s,s+strlen(s);vector:iterator p;/定义一个指向定义一个指向v的向量指针的向量指针p p=v.begin();for(int i=0;iv.size();i+)cout*(p+i);cout=v.begin();p-)cout*p;coutendl;381 1)对向量的访问可以是双向的。)对向量的访问可以是双向的。)对向量的访问可以是双向的。

49、)对向量的访问可以是双向的。用用用用reverse_iteratorreverse_iterator声明声明声明声明逆向逆向逆向逆向泛型指针的形式:泛型指针的形式:泛型指针的形式:泛型指针的形式:vector:reverse_iterator vector:reverse_iterator 指针名指针名指针名指针名注意:如此定义的指针只能由逆向指针注意:如此定义的指针只能由逆向指针注意:如此定义的指针只能由逆向指针注意:如此定义的指针只能由逆向指针rbegin()rbegin()和和和和rend()rend()赋值赋值赋值赋值.39例题:分析如下程序的运行结果例题:分析如下程序的运行结果(lt

50、7_6d2.cpp)#include#include#includeusing namespace std;void main()char s=happy;vectorv(s,s+strlen(s);vector:reverse_iterator p;cout正向字符串正向字符串:=v.rbegin();p-)cout*p;coutendl;cout逆向字符串逆向字符串:endl;for(p=v.rbegin();p=v.rend();p+)cout*p;coutendl;40特别注意特别注意(总结)(总结)向量不是数组!向量不是数组!向量名不是数组名,不表示地址!向量名不是数组名,不表示地址

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁