向量(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
不难发现,用现成的向量来实现模拟栈的功能非常方便。我们不需要研究压栈和退栈的详细实现方法,而只需要知道何时操作就行了。读到这里,可能你还没有完全明白到底什么是类,什么是对象,甚至搞不清创建对象的时候,对象名旁边的括号里面应该填什么。没关系,这些都不是本章所要掌握的内容。你只要会照猫画虎地使用字符串和向量就可以了。