顺序容器,指的是将一组具有相同类型T的对象,以严格的线性形式组织在一起。顺序由容器可以视为数组和链表的推广。包括三种顺序容器:vector<T>,deque<T>和list<T>。
vector是一种顺序容器,存放的元素是以连续的数组的方式存储的,也就是说可以通过v[i]的方式访问vector中的元素,此时vector的访问时间是非常小的。而在对特定的值进行访问时,只能通过遍历vector的方式进行比较,这样的操作会导致较大的时间开销。同时在对vector的中间插入元素或删除元素时,由于需要保持元素的连续性,通常会导致vector把后面的元素复制一遍甚至与重新分配的数组。因此,在随机插入方面vector相对来说性能较低。
注意:vector多用于不需要对数据进行随机增,删的场合。
//如果要在程序中使用vector,必须包含下面的头文件:
#include<vector>
//如果要在程序中使用vector,必须包含下面的头文件;
#include<vector>
//vector属于std命名域的,因此需要通过命名限定,代码如下:
using std::vector;
vector<int>vInts;
//或者是连在一起,使用全名,代码如下:
std::vector<int>vInts;
//还可以像<iostream>中的cout一样使用全局的命名域方式:
using namespace std;
//有多种方法可以创建vector容器,以下介绍几种常用的。
//创建一个Widget类型的空的vector对象:
vector<Widget>vWidgets; //空的vector对象
//创建一个包含500个Widget类型数据的vector:
vector<Widget>vWidgets(500); //包含500个对象的vector
//创建一个包含500个Widget类型数据的vector,并且都初始化为0;
vector<Widget>vWidgets(500,Widget(0)); //包含500个对象的vector,并初始化为0
//利用现有的vector创建一个拷贝:
vector<Widget>vWidgetsFromAnother(vWidgets); //利用现有的vector创建一个拷贝
vector是一种容器,那么可以向vector添加一个数据,vector添加数据的默认方法是push_back()。push_back()函数表示将数据添加到vector的尾部,并按需求来分配内存。例如,在vector<Widget>中添加10个数据,需要编写如下代码:
for (int i = 0; i < 10; i++)
v.push_back(Widget[i]);
很多时候不必要知道vector里面有多少数据,因为vector中的数据是动态分配的,使用push_back()将导致vector的数据增加。如果想知道vector是否存放两种数据,可以使用empty()函数。要过去vector的大小,可以使用size()。如果想获取一个vector v 的大小,但不知道它是否为空,或者已经包含了数据。如果空想设置为0,可以使用下面的代码实现:
int nSize = v.empty() ? -1 : static_cast<int>(v.size());
访问vector中的数据有如下两种方法。
a.vector::at();
b.vector::operator[];
operator[]主要是为了与C语言进行兼容。使用该操作可以向C语言数组一样操作,但at()是首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个异常,而operator[]却不会。因此operator[]容易造成一些错误,一般不使用它,如下代码所示:
vector<int>v;
v.reserve(10);
for (int i = 0; i < 7; i++)
v.push_back(i);
try
{
int iVal1 = v[7];
int iVal2 = v.at(7);
}
catch (const exception &e)
{
cout << e.what();
}
vector能够非常容易的添加数据,也能很方便的取出数据,同样vector提供了erase(),pop_back(),clear()来删除数据。当删除数据的时候,需要知道要删除尾部的数据,或者是删除所有数据,还是个别数据。