第七章类模板与向量C++程序设计2本章主要内容类模板向量与泛型算法3类模板类与函数一样,当多个类之间只是数据类型不一样时,也可以通过模板的形式定义成一个特定的模板类。该类为需要不同的数据类型的类提供了统一的模板,即类模板。4类模板类模板声明格式如下:template类模板参数class类名{……….}模板参数可用作数据成员的类型、成员函数的参数类型、成员函数的返回值类型等templateclassTclassTest{Tx,y;public:Test(Ta,Tb){x=a;y=b;}Tgetx(){returnx;}Tgety(){returny;}};5类模板类模板的对象创建对象时,显示的指定其数据类型,编译器就用指定的数据类型替代模板参数产生相应的模板类格式如下:类名模板实例化参数类型对象名(构造函数实参列表);Testinttest1(15,30);6类模板在类体外面定义成员函数时,必须重写类模板声明template模板参数返回类型类名模板类型参数::成员函数名(参数列表){……..}参照P148【例7.2】7类模板类模板也可以像普通类一样继承,继承的方法也一样。继承的基类与派生类既可以是模板类,也可以是普通类。模板类继承普通类参照P149【例7.4】模板类继承模板类参照P150【例7.5】8向量与泛型算法向量:数组的大小是不能改变的,而向量中存储的元素多少可以在运行时根据需要动态的增长或缩小,向量是类模板向量类模板定义在头文件vector中,提供了4种构造函数1.vectortypename;定义空的向量表vectorcharA;2.vectortypename(length);定义具有length个type的向量,初始化为0vectorintB(20);3.vectortypename(length,a);定义具有length个type的向量,初始化为avectorintC(20,1);4.vectortypename1(name);使用已定义的向量name构造新的向量name1vectorintD(C);9向量与泛型算法向量的第一个元素从0开始允许同类型的向量之间相互赋值,跟他们的长度无关不能直接使用列表初始化向量,可先定义一个数组,再把数组的内容复制给向量inta[3]={1,2,3};vectorintb(a,a+3);10向量与泛型算法向量的数据类型可以是基本数据类型,也可以是构造类型,但必须符合构成规则参考P154【例7.7】~【例7.8】11向量与泛型算法向量具有指向第一个元素的标记begin()和指向结束的标记end()定义泛型指针vectortype::iterator泛型指针名;定义逆向泛型指针reverse_vectortype::reverse_iterator指针名;参考P153【例7.6】12向量的基本操作方法访问向量容量信息的方法1.size()返回当前向量中对象的个数a.size();2.max_size()返回向量最多可以容纳多少个对象,取决于硬件结构a.max_size();3.capacity()返回无需再次分配内存就能容纳的对象个数,初始值为最初申请的元素个数,当原来的空间存放满了之后,则在原来的基础上自动翻倍扩充a.capacity();以上三者的关系如下:max_size()=capacity()=size()4.empty()返回当前向量是否为空,若为空返回true值,即返回值为1,反之为0a.empty();13向量的基本操作方法访问向量中对象的方法1.front()返回向量中的第一个对象a.front();2.back()返回向量中的最后一个对象a.back();3.operator[](size_typen)返回向量中下标为n的向量元素a.operator[](5);参照P156【例7.9】14向量的基本操作方法在向量中插入对象的方法1.push_back(constT&)在向量尾部插入一个对象a.push_back(‘w’);2.insert(iteratorit,constT&)在it所指向的位置前插入一个对象a.insert(3,’h’);3.insert(iteratorit,size_typen,constT&X)在it所指向的位置前插入n个值为X的对象a.insert(3,5,’h’);15向量的基本操作方法在向量中删除对象的方法1.pop_back()删除向量中最后一个对象a.pop_back();2.erase(iteratorit)删除it所指向位置的对象a.erase(3);3.clear()删除向量中的所有对象,此时empty()返回true值a.clear();参照P157【例7.10】