向量(Vector)是一个深奥的词。不过这里的向量不是数学里的向量,也不是物理里的向量。在C++中的向量,就是一个存放数据的地方,类似于一维数组和链表。

向量的性能

在第九章末尾,我们介绍了数组存储和链表存储的优缺点。数组的缺点是分配空间不灵活;链表的缺点是无法通过下标快速找到结点。

然而这里介绍的向量却吸收了这两种数据结构各自的优点,综合性能较高。



向量的分配空间是会随着数据的量而变化的,如果空间不够,那么向量的空间会自动增长。类似于数组,我们也可以通过下标来访问向量中的数据元素,增快找到数据的速度。


万用的模板

在编写链表程序的时候,我们一定有这样的困惑:链表里面存储的数据类型可能是各种各样的,难道我们要为各种数据类型都写一个链表程序么?我们能不能写一个万用的链表程序呢?


在PowerPoint之类的软件中,有一种模板功能。模板提供的文档框架是基本完整的,我们只需要在一些地方填写上自己需要的内容,就是一个完整的文档。在C++中,也有这么一种模板(Template),我们只需要在使用之前填写自己需要的数据类型,就是一个完整的程序。我们把具有模板功能的类称为模板类,向量就是一个模板类。在这一节,我们只需要了解如何使用向量这个模板类。关于更多模板的知识,将在后面的章节再作介绍。



在上一节中,我们不难看出创建一个对象的方法是:


   

类名对象名(初始化数据);


而创建一个模板类对象的方法是:


   

类名<数据类型列表> 对象名(初始化数据);


即在类名之后填写数据类型,来创造一个符合自己需要的对象。


对向量的操作

同字符串一样,向量也有着自己的各种操作。下表就是向量常用的一些操作:



由于涉及迭代器(Iterator)的知识,我们无法学习向量的插入数据和删除数据操作。有兴趣的读者可以去看一下《C++ Primer》的相关章节。



下面我们用向量来解决习题9.6.2,模拟一下栈操作:(程序13.4)


不难发现,用现成的向量来实现模拟栈的功能非常方便。我们不需要研究压栈和退栈的详细实现方法,而只需要知道何时操作就行了。

#include <vector> 

 #include <iostream> 

 using namespace std; 

 int main() 

 { 

    vector<char> stack(0);//新建一个名为stack的存放字符数据的向量,初始元素个数为0 

    char temp; 

    cout <<"请输入指令:" <<endl; 

    do 

    { 

       cin >>temp; 

       if (temp!='#') 

       { 

          if (temp!='$') 

          { 

             stack.push_back(temp);//模拟压栈操作 

          } 

         else 

          { 

             stack.pop_back();//模拟退栈操作 

          }  

       } 

    }while (temp!='#'); 

    for (int i=0;i<stack.size();i++) 

       cout <<stack[i];//可以用下标访问数据元素 

    cout <<endl; 

    return 0; 

 } 


 运行结果: 

 请输入指令: 

 ABC$DEFG$$$HIJ$KLM$# 

 ABDHIKL



读到这里,可能你还没有完全明白到底什么是类,什么是对象,甚至搞不清创建对象的时候,对象名旁边的括号里面应该填什么。没关系,这些都不是本章所要掌握的内容。你只要会照猫画虎地使用字符串和向量就可以了。