第七部分思维导图PDF下载C++程序设计 第七章 类模板与向量

7.1 类模板与向量

7.1.1 类模板基础知识

  • 1、类模板的成分及语法
    • template/class <类模板参数> class 类名 {//类体};

      类模板参数为虚拟化类型名

      • template
      • class TAnyTemp{T x, y;};
    • 类模板也称为参数化类。初始化类模板时,只要传给它指定的数据类型(如double或int),编译器就用指定类型替代模板参数产生相应的模板类。

  • 2、类模板的对象

    • 类模板定义对象的一般格式
      • 类名<模板实例化参数类型>对象名(构造函数实参列表);
        • TAnyTempiObject(321,556);
      • 类名<模板实例化参数类型>对象名; //默认或者无参数构造函数
        • TAnyTempiObject();
    • 定义
      • 在类体外定义成员函数时,必须用template重写类模板声明,即再写一遍。
      • 格式
        • template<模板参数>
        • 返回类型 类名<模板类型参数>::成员函数名(函数参数列表){//函数体}

        • 模板实例化参数类型包括

          • 数据类型
          • 如: template

7.1.2 类模板的派生与继承

  • 类模板的继承方法与普通的类一样。
  • 声明模板继承之前,必须重新声明类模板。
  • 模板类的基类和派生类都可以是模板(或非模板)类
  • 模板类继承非模板类
  • 模板类派生模板类

7.2 向量与泛型算法

向量的概念

  • 与数组相似,其中的元素项是连续存储的,能够存放各种类型的对象。
  • 与数组的不同点是向量存储元素的多少可以在运行中根据需要动态地增加或缩小。
  • 向量是类模板,具有成员函数。

7.2.1 定义向量列表

  • 向量类模板定义在头文件
  • 有4种构造函数
    • vectorname;
      • 定义type的向量空表
        • 空表没有元素,它使用成员函数获取元素
    • vectorname (length);
      • 定义具有length个type的向量
    • vectorname (length, a);
      • 定义具有length个type的向量,元素初始化为a
    • vectorname1 (name);
      • 使用已定义的向量name构造向量name1
  • 允许同类型的向量列表相互赋值,不管它们的长度如何,向量可以改变赋值目标的大小,使它的元素数目与赋值源的元素数目相同。

  • 常用向量遍历器

    • for( int i = 0; i < A.size( ); i++ )
    • cout << A[ i ] << endl;
  • 一种常见的定义向量的方法
    • 用一个已经定义了的向量去初始化另一个,即定义时同时完成初始化,如
      • int IA [ 10 ] = {1,2,3,4,5,6};
      • vectorVB ( IA, IA+10 );
    • 但这种方法不可以去初始化一个已经声明或定义了的向量

7.2.2 泛型指针

  • “与操作对象的数据类型相互独立“的算法称为泛型算法。
  • 这种算法和想要操作的元素类型无关。
  • 声明正向泛型指针

    • vector::iterator 泛型指针名
      • 如,vector::interator p;
  • 声明逆向泛型指针
    • vector::reverse_iterator 泛型指针名
      • 如,vector::reverse_interator p;
  • 两对重要的指针
    • 正向
      • a.begin() 在前
      • a.end() 在后
    • 逆向
      • a.rend() 在前
      • a.rbegin() 在后
  • 使用方法
    • typedef vector::interator interator
    • iterator p;

7.2.3 向量的数据类型

  • 结合数组的泛型算法函数实现对向量的操作
    • copy(va.begin(), va.end(), ostream)iteratro<数据类型>(cout,” “)); //正向输出
    • reverse_copy(va.begin(), va.end(), ostream)iteratro<数据类型>(cout,” “)); //逆向输出
    • copy(vb.begin(), vb.end(), va.begin( )); //正向复制
    • reverse_copy(vb.begin(), vb.end(), va.begin( )); //逆向复制
    • sort(va.begin(), va.end( )); //升幂排序
    • sort(va.begin(), va.end( ), greater<数据类型>()); //降幂排序
    • va.swap(vb); //交换va和vb的内容
  • 编译系统为向量类型每个元素分配16个字节,泛型算法与类型无关,对使用不同数据类型构成的向量,均为16字节。

7.2.4 向量的基本操作方法

  • 1、访问向量容器信息的方法

    • 1、size(),返回当前向量中已经存放的对象的个数
    • 2、max_size():返回向量可以容纳最多对象的个数
    • 3、capacity():返回无需再次分配内存就能容纳的对象个数,即已申请的空间。
      • 当空间已满,再增加一个时,会在原来的基础上自动翻倍扩充空间!
    • 三者关系: max_size() >= capacity() >= size()

  • 2、访问向量中对象的方法

    • 1、front():返回向量种的第一个对象。
    • 2、back():返回向量中的最后一个对象。
    • 3、operator[ ](size_type, n):返回向量中的第n+1个对象(下标为n的向量元素)。
  • 3、在向量中插入对象的方法
    • push_back(const T&):向向量尾部插入一个对象。
    • insert(iterator it, const T&):向it所指的向量位置前插入一个对象。
    • insert(iterator it, size_type n, const T&X):向it所指向量位置前插入n个值为X的对象。
  • 4、在向量中删除对象的方法
    • pop_back(const T&):删除向量中最后一个对象。
    • erase(iterator it):删除it所指向的容器对象。
    • clear():删除向量中的所有对象,empty()返回true值。
最后修改日期:十一月 5, 2019

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。