1、第七章类模板与向量2本章考核要求本章考核要求本章考核要求本章考核要求:5 5 5 5、了解类模板得派生与继承、了解类模板得派生与继承、了解类模板得派生与继承、了解类模板得派生与继承,理解模板类继承非模板与从类理解模板类继承非模板与从类理解模板类继承非模板与从类理解模板类继承非模板与从类模板派生一个类模版两种情况模板派生一个类模版两种情况模板派生一个类模版两种情况模板派生一个类模版两种情况,最终达到最终达到最终达到最终达到“领会领会领会领会”层次层次层次层次6 6 6 6、理解向量得概念、理解向量得概念、理解向量得概念、理解向量得概念,会定义向量列表会定义向量列表会定义向量列表会定义向量列表,达
2、到达到达到达到”领会领会领会领会“层次。层次。层次。层次。7 7 7 7、掌握定义向量使用得基本数据类型、掌握定义向量使用得基本数据类型、掌握定义向量使用得基本数据类型、掌握定义向量使用得基本数据类型,达到达到达到达到“简单应用简单应用简单应用简单应用”层层层层次。对构造类型一般性了解次。对构造类型一般性了解次。对构造类型一般性了解次。对构造类型一般性了解,达到达到达到达到“识记识记识记识记”层次。层次。层次。层次。8 8 8 8、掌握向量容器指定位置插入与删除对象得方法、掌握向量容器指定位置插入与删除对象得方法、掌握向量容器指定位置插入与删除对象得方法、掌握向量容器指定位置插入与删除对象得方
3、法,达到达到达到达到“简简简简单应用单应用单应用单应用”层次。层次。层次。层次。9 9 9 9、了解向量其她得操作方法、了解向量其她得操作方法、了解向量其她得操作方法、了解向量其她得操作方法,达到达到达到达到“识记识记识记识记”层次。层次。层次。层次。第七章类模板与向量第七章类模板与向量3相关知识回顾相关知识回顾1、函数得重载、函数得重载 函数重载可以使一个函数名具有多种功能函数重载可以使一个函数名具有多种功能,即具有多种即具有多种形态形态,称这种特性为称这种特性为 。多态性多态性 当函数得参数当函数得参数 不同不同,或者参数或者参数 不同时不同时,函数可以重载。仅有函数返回值不同函数可以重载
4、。仅有函数返回值不同 区分重载区分重载函数。函数。类型类型个数个数不能不能 有些函数重载时参数个数相同有些函数重载时参数个数相同有些函数重载时参数个数相同有些函数重载时参数个数相同,只就是类型不同只就是类型不同只就是类型不同只就是类型不同,此此此此时重载函数比较繁琐时重载函数比较繁琐时重载函数比较繁琐时重载函数比较繁琐,可利用可利用可利用可利用 实现。实现。实现。实现。函数模板函数模板函数模板函数模板42、函数模板、函数模板 c+规定模板以规定模板以 关键字与一个形参关键字与一个形参表开头。表开头。template 将函数模板与某个具体数据类型连用将函数模板与某个具体数据类型连用,就产生了就产
5、生了 ,又称这个过程为函数模板实例化又称这个过程为函数模板实例化,这种形式就就是类型参这种形式就就是类型参数化。数化。模板函数模板函数函数执行时确定参数类型得函数称为模板函数。函数执行时确定参数类型得函数称为模板函数。函数执行时确定参数类型得函数称为模板函数。函数执行时确定参数类型得函数称为模板函数。5例如:例如:T max(T a,T b)if(ab)return a;else return b;template 另外另外,c+还专门定义了一个还专门定义了一个仅仅用在模板中得关键字仅仅用在模板中得关键字 ,它得用途之一就它得用途之一就是代替是代替template参数列表中参数列表中得关键字得
6、关键字class。typename62、函数模板、函数模板 函数模板就是不能直接执行得函数模板就是不能直接执行得,需要实例化为模板函需要实例化为模板函数后才能执行。数后才能执行。使用格式使用格式:模板函数名模板函数名 (实参表实参表)(显式比较准则显式比较准则)或者或者:模板函数名模板函数名(实参表实参表)(默认方式默认方式)7如有函数模板如下如有函数模板如下: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
7、、5);m3=max(a,A);或者或者则对该函数模板得使用有则对该函数模板得使用有:注注:要想省去显式调用得要想省去显式调用得麻烦麻烦,条件就是由这个调条件就是由这个调用得函数参数表能够惟用得函数参数表能够惟一地去标识出模板参数一地去标识出模板参数得一个集合。得一个集合。在调用函数模板时在调用函数模板时,得类型决定到底使得类型决定到底使用模板得哪个版本。也就就是说用模板得哪个版本。也就就是说,模板得参数就是由模板得参数就是由 得参数推断出来得。得参数推断出来得。函数参数函数参数函数函数8class PointIntint x,y;public:PointInt(int a=0,int b=0
8、):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 setxy(float a,float b)x=a;y=b;void showxy()coutx,yendl;float getx()return x;float gety()return y;void main()PointInt
9、 a(3,4);a、showxy();PointFloat b(1、2,3、4);b、showxy();分析以下程序得结果分析以下程序得结果(lt7_1a、cpp)9class 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
10、 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;分析以下程序得结果分析以下程序得结果(lt7_1a、cpp)分析分析PointInt类与类与PointFloat类得类得异同?异同?类中得数据成员类中得数据成员以及实现得操作以及实现得操作相同相同,只就是数只就是数据类型不同。据类型不同。为了避免因为类得数据类为了避免因为类得数据类型不同而产生得重复性设型不同而产生得重复性设计计,可以将这些数据类型可以将这些数据类
11、型从类中分离出来形成一个从类中分离出来形成一个通用得数据类型通用得数据类型T,为这个为这个数据类型数据类型T设计一个操作设计一个操作集集,就就是类模板就就是类模板 T TT T T T TTTTTTTT10将数据类型抽象出来而形成得操作集将数据类型抽象出来而形成得操作集: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;117 7、1 1类模板类模板 类模板使用户可以为类
12、定义一种模式类模板使用户可以为类定义一种模式,使得类中得使得类中得某些数据成员、成员函数得参数与返回值能取得任意某些数据成员、成员函数得参数与返回值能取得任意数据类型。数据类型。类模板用于实现类所需数据得类型参数化。所以类模板用于实现类所需数据得类型参数化。所以类模板也称为参数化类。类模板也称为参数化类。12一、类模板基础知识一、类模板基础知识1、类模板声明得一般格式、类模板声明得一般格式:template class 类名类名 类体类体;例如例如:13class PointT x,y;public:Point(T a=0,T b=0):x(a),y(b)void setxy(T a,T b)
13、x=a;y=b;void showxy()coutx,yendl;T getx()return x;T gety()return y;template 模版以模版以template关关键字与一个形参表键字与一个形参表开头。开头。14void 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;voi
14、d setxy(T a,T b)x=a;y=b;void setxy(T,T);template 注注:在类体外面定义成员函数在类体外面定义成员函数时时,必须用必须用template重写类重写类模板声明!模板声明!15注注:在类体外面定义成员函数时在类体外面定义成员函数时,必须用必须用template重写类模重写类模板声明!板声明!(P148)一般格式为一般格式为:template 返回类型返回类型 类名类名:成员函数名成员函数名(函数参数列表函数参数列表)函数体函数体指指template得得内使用内使用class(或或typename)声明得类型参数。声明得类型参数。如上例中得如上例中得:t
15、emplate void Point:setxy(T a,T b)x=a;y=b;162 2、类模板对象、类模板对象 类模板不能直接使用类模板不能直接使用,必须先实例化为相应得模板必须先实例化为相应得模板类类,定义该模板类得对象后才能使用。定义该模板类得对象后才能使用。初始化类模板时初始化类模板时,只要传给它指定得数据类型只要传给它指定得数据类型(如如int,float,double等等),编译器就用指定得类型代替模板编译器就用指定得类型代替模板参数产生相应得模板类。参数产生相应得模板类。17 用类模板定义对象得一般格式用类模板定义对象得一般格式:类名类名 对象名对象名(构造函数实参列表构造函
16、数实参列表)或者或者:类名类名 对象名对象名 编译器不能从构造编译器不能从构造函数参数列表推断函数参数列表推断出模板实例化参数出模板实例化参数类型,所以必须显类型,所以必须显式地给出对象的参式地给出对象的参数类型数类型18例如例如: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();Po
17、int b(1、2,3、4);b、showxy();显式地给显式地给出对象的出对象的参数类型参数类型19例题例题:分析以下程序结果分析以下程序结果(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,
18、2、3,3、4,4、5);coutx、s()endl;couty、s()endl;coutz、s()endl;22二、类模板得派生与继承二、类模板得派生与继承 类模板也可以继承。声明模板继承之前类模板也可以继承。声明模板继承之前,必须重新必须重新声明类模板。模板类得基类与派生类都可以就是模板声明类模板。模板类得基类与派生类都可以就是模板类或者非模板类类或者非模板类,本节只介绍其中两种情况本节只介绍其中两种情况:1 1、从非模板类派生类模板、从非模板类派生类模板、从非模板类派生类模板、从非模板类派生类模板23class Point /非模板类非模板类protected:int x,y;publi
19、c: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,y2endl;T len
20、gth()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;242 2,从类模板派生一个类模板从类模板派生一个类模板从类模板派生一个类模板从类模板派生一个类模板 类模板使用时类模板使用时类模板使用时类模板使用时,须指出类模板得参数须指出类模板得参数须指出类模板得参数须指出类模板得参数给出类模板参数后得到一个模板类给出类模板参数后得到一
21、个模板类给出类模板参数后得到一个模板类给出类模板参数后得到一个模板类继承后成员得访问权限变化同一般类得继承继承后成员得访问权限变化同一般类得继承继承后成员得访问权限变化同一般类得继承继承后成员得访问权限变化同一般类得继承25class 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:Line(int a,int b
22、,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(4,5,6,7);ab、sho
23、wLine();coutab线段长度线段长度:ab、length()endl;Lineac(1、5,2、5,4、5,6、5);ac、showLine();coutac线段长度线段长度:ac、length()endl;27类模板总结类模板总结类模板得定义格式类模板得定义格式类模板得成员函数定义在类体外时注意事项类模板得成员函数定义在类体外时注意事项类模板如何产生一个模板类并定义对象类模板如何产生一个模板类并定义对象类模板与函数模板不同之处类模板与函数模板不同之处:类模板无法从构造函数得参数中判断出类模板无法从构造函数得参数中判断出T得类型得类型,必须显式给出模板得参数。必须显式给出模板得参数。类
24、模板得派生类模板得派生类模板继承普通类类模板继承普通类,类模板派生类模板类模板派生类模板297 7、2 2向量与泛型算法向量与泛型算法 向量就是向量就是向量就是向量就是C+C+中一维数组得类版本中一维数组得类版本中一维数组得类版本中一维数组得类版本,它与数组相似它与数组相似它与数组相似它与数组相似,其中得元素就是连续存储得其中得元素就是连续存储得其中得元素就是连续存储得其中得元素就是连续存储得,不同得就是不同得就是不同得就是不同得就是:向量中存储元向量中存储元向量中存储元向量中存储元素得多少可以在运行中根据需要动态地增长或缩小。素得多少可以在运行中根据需要动态地增长或缩小。素得多少可以在运行中
25、根据需要动态地增长或缩小。素得多少可以在运行中根据需要动态地增长或缩小。30数组数组数组数组:用于存放相同类型得数据用于存放相同类型得数据用于存放相同类型得数据用于存放相同类型得数据;通过数组元素使用通过数组元素使用通过数组元素使用通过数组元素使用;数组一旦定义数组一旦定义数组一旦定义数组一旦定义,其大小即固定不变其大小即固定不变其大小即固定不变其大小即固定不变;可使用泛型算法。可使用泛型算法。可使用泛型算法。可使用泛型算法。向量向量向量向量:用于存放多个相同类型得数据用于存放多个相同类型得数据用于存放多个相同类型得数据用于存放多个相同类型得数据;利用对象使用利用对象使用利用对象使用利用对象使
26、用;可动态指定向量中元素得个数可动态指定向量中元素得个数可动态指定向量中元素得个数可动态指定向量中元素得个数;提供了多个成员函数以方便数据使用提供了多个成员函数以方便数据使用提供了多个成员函数以方便数据使用提供了多个成员函数以方便数据使用;可使用泛型算法。可使用泛型算法。可使用泛型算法。可使用泛型算法。31一、定义向量列表一、定义向量列表一、定义向量列表一、定义向量列表就是就是就是就是C+C+中得类模板。使用时加头文件中得类模板。使用时加头文件中得类模板。使用时加头文件中得类模板。使用时加头文件vectorvector。向量得声明形式向量得声明形式向量得声明形式向量得声明形式:(以下形式中以下
27、形式中以下形式中以下形式中lengthlength表示长度表示长度表示长度表示长度,typetype表示类型表示类型表示类型表示类型,namename表示表示表示表示向量对象名向量对象名向量对象名向量对象名)1 1)vector namevector name;/定义定义定义定义typetype得向量空表得向量空表得向量空表得向量空表,没有元素没有元素没有元素没有元素2 2)vector name(length)vector name(length);/定义具有定义具有定义具有定义具有lenghlengh个个个个typetype得向量得向量得向量得向量,元素初始化为元素初始化为元素初始化为元素
28、初始化为0 0323 3)vector name(length,n)vector name(length,n);/定义具有定义具有定义具有定义具有lenghlengh个个个个typetype得向量得向量得向量得向量,元素初始化为元素初始化为元素初始化为元素初始化为n n4 4)vector name(name1)vector name(name1);/使用已定义得向量使用已定义得向量使用已定义得向量使用已定义得向量name1name1构造向量构造向量构造向量构造向量namename5 5)vector name(a,a+vector name(a,a+长度长度长度长度);/将已经定义好得数组将
29、已经定义好得数组将已经定义好得数组将已经定义好得数组a a得内容复制给向量得内容复制给向量得内容复制给向量得内容复制给向量33向量得定义形式向量得定义形式:1 1)vector namevector name;2 2)vector name(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)1)定义字符
30、型空向量定义字符型空向量A AvectorA;2)2)定义定义5 5个个intint型向量型向量B,B,元素初始化为元素初始化为0 0 vectorB(5);34向量得定义形式向量得定义形式:1 1)vector namevector name;2 2)vector name(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+len
31、gth);例题例题:3)定义定义10个个int型向量型向量C,元素初始化为元素初始化为3vectorC(10,3);35向量得定义形式向量得定义形式:1 1)vector namevector name;2 2)vector name(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);例题例题:4)用向量用向量C构造
32、向量构造向量DvectorD(C);36向量得定义形式向量得定义形式:1 1)vector namevector name;2 2)vector name(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);例题例题:5)定义定义5个字符型向量个字符型向量E,并初始化为并初始化为avectorE(5,a);37D=B例
33、题例题:6)将将B赋值给赋值给D同类型得向量可以相互赋值同类型得向量可以相互赋值,而不管它们得长度如何。向而不管它们得长度如何。向量可以改变赋值目标得大小量可以改变赋值目标得大小,使它得元素数目与赋值源得使它得元素数目与赋值源得元素数目相同。元素数目相同。向量得定义形式向量得定义形式:1 1)vector namevector name;2 2)vector name(length)vector name(length);3 3)vector name(length,n)vector name(length,n);4 4)vector name(name1)vector name(name1)
34、;5 5)vector name(a,a+length)vector name(a,a+length);38例题例题:7)若已有数组定义如下若已有数组定义如下:int a5=1,2,3,4,5;则则:把数组中得全部元素复制到向量把数组中得全部元素复制到向量F中中vectorF(a,a+5);向量得定义形式向量得定义形式:1 1)vector namevector name;2 2)vector name(length)vector name(length);3 3)vector name(length,n)vector name(length,n);4 4)vector name(name1)
35、vector name(name1);5 5)vector name(a,a+length)vector name(a,a+length);39向量得使用向量得使用:由由由由vectorvector定义得对象定义得对象定义得对象定义得对象C+C+中称为向量中称为向量中称为向量中称为向量同类型向量可相互赋值同类型向量可相互赋值同类型向量可相互赋值同类型向量可相互赋值,不同类型不可相互赋值不同类型不可相互赋值不同类型不可相互赋值不同类型不可相互赋值同类向量长度不同也可相互赋值同类向量长度不同也可相互赋值同类向量长度不同也可相互赋值同类向量长度不同也可相互赋值向量中得元素使用类似数组元素向量中得元素
36、使用类似数组元素向量中得元素使用类似数组元素向量中得元素使用类似数组元素,可使用向量名可使用向量名可使用向量名可使用向量名 下标下标下标下标 向量具有成员函数向量具有成员函数向量具有成员函数向量具有成员函数size()size()可得到向量长度可得到向量长度可得到向量长度可得到向量长度40例题例题:补全程序并分析程序结果补全程序并分析程序结果(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(
37、int i=0;iF、size();i+)coutFi;coutendl;向量具有成员函数向量具有成员函数sizesize()()可得到向量长度可得到向量长度向量中得元素使向量中得元素使用类似数组元素用类似数组元素,可使用向量名可使用向量名下标下标得形式得形式42二、泛型指针二、泛型指针与操作对象得数据类型相互独立得算法称为与操作对象得数据类型相互独立得算法称为 。泛型算法泛型算法1 1 1 1、向量成员函数、向量成员函数、向量成员函数、向量成员函数begin(),end(),rbegin(),rend()begin(),end(),rbegin(),rend()begin(),end(),r
38、begin(),rend()begin(),end(),rbegin(),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()43特别注意特别注意向量得成员函数向量得成员函数begin()+1 表示下一个地址表示下一个地址end()-1 表示前一个地址表示前一个地址rbegin()+1 表示前一个地址表示前一个地址rend()-1 表示下一个地址表示下一个地址44例题例题:用用begin(),end(),rbegin(),rend()函数输出向量元素。函数输出向量元素。(lt
40、7_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;输出向量元输出向量元素得个数素得个数45若有向量定义若有向量定义:vector F(a,a+5)for(int i=0;i F、size();i+)/正向输出向量中得元素正向输
41、出向量中得元素 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);coutendl462、利用普通指针指向向量元素、利用普通指针指向向量元素向量成员函数向量成
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=vp=v、begin();/begin();/指针指针指针指针p p指向了指向了指向了指向了v v中得首元素中得首元素中得首元素中得首元素若使若使p指向尾元素可使用语句指向尾元素可使用语句:p=v、end()-1;注意注意:只能用正向指针来赋值只能用正向指针来赋值,而不能用逆向指针赋值。而不能用逆向指针赋值。如如:p=v、rbegin()或者或者 p=rend()都就是错误得。都就是错误得。47例题例题:用普通指针输出向量元素用普通指针输出向量
44、元素(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;483、泛型指针、泛型指针类模板类模板类模板类模板vectorvector中提供了一个通用指针中提供了一个通用指针中提供了一个通用指针中提供了一个通用指针iteratoriterator,如果用如果用如果用如果用T T表示向量得参数化数据类
45、型表示向量得参数化数据类型表示向量得参数化数据类型表示向量得参数化数据类型,iteratoriterator相当于相当于相当于相当于T*T*。1 1)用用用用iteratoriterator声明正向泛型指针得形式声明正向泛型指针得形式声明正向泛型指针得形式声明正向泛型指针得形式:vector:iterator vector:iterator 指针名指针名指针名指针名例如例如:vector:iterator p;表示定义了一个指向表示定义了一个指向int型向量得指针型向量得指针p49注意注意注意注意:泛型指针就是使用类实现得泛型指针就是使用类实现得泛型指针就是使用类实现得泛型指针就是使用类实现得
46、 该指针可指向向量中得元素该指针可指向向量中得元素该指针可指向向量中得元素该指针可指向向量中得元素 可使用可使用可使用可使用*p p表示它指向得元素值表示它指向得元素值表示它指向得元素值表示它指向得元素值 只能用正向指针给只能用正向指针给只能用正向指针给只能用正向指针给p p赋值赋值赋值赋值,如如如如beginbegin()()、endend()()。50用用用用iteratoriterator声明正向泛型指针得形式声明正向泛型指针得形式声明正向泛型指针得形式声明正向泛型指针得形式:vector:iterator vector:iterator 指针名指针名指针名指针名例题例题:如有向量定义如
47、有向量定义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 ;51练习练习:补全程序并分析运行结果补全程序并分析运行结果(lt7_6d、cpp)#include#include#includeusing names
48、pace 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;521 1)对向量得访问可以就是双向得。对向量得访问可以就是双向得。对向量得访问可以就是双向得。对向量得访问可以就是双向得。用用用用reverse_iteratorreverse_iterator声明逆向泛型指针得形式声明逆向泛型指针得形
49、式声明逆向泛型指针得形式声明逆向泛型指针得形式:vector:reverse_iterator vector:reverse_iterator 指针名指针名指针名指针名注意注意注意注意:如此定义得指针只能由逆向指针如此定义得指针只能由逆向指针如此定义得指针只能由逆向指针如此定义得指针只能由逆向指针rbegin()rbegin()与与与与rendrend()()赋值赋值赋值赋值、53例题例题:分析如下程序得运行结果分析如下程序得运行结果(lt7_6d2、cpp)#include#include#includeusing namespace std;void main()char s=happy;
50、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;54特别注意特别注意(总结总结)向量不就是数组!向量不就是数组!向量名不就是数组名向量名不就是数组名,不表示地址!不表示地址!也不可使用也不可使用&取向量元素得首地址!取向量元素得首地址!int*p;vector c;p=c;p=&c;不可使用如此形式!不可使用如此形式!55特
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100