向量vector

来源:互联网 发布:ubuntu 开启ssh服务 编辑:程序博客网 时间:2024/05/01 08:42

向量(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;}

运行结果:
请输入指令:
ABCDEFG$$HIJ$KLM$#
ABDHIKL

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

0 0