vector是c++标准库中的一种顺序容器。顺序容器的类型有以下几种:


  1. vector 可变大小数组
  2. deque 双端队列
  3. list 双向链表
  4. forward_list 单向链表
  5. array 固定大小数组
  6. string 与vector相似的容器,专门用于字符串

其中,stringvector将元素保存在连续的内存空间中,因此利用下标随机访问元素非常快,但是在中间位置插入或删除元素很慢。listforward_list在任何位置插入或删除元素都很快,但都不支持元素的随机访问。为了访问一个元素需要遍历整个容器。deque是一个更为复杂的数据结构,与string和vector类似,deque支持快速的随机访问

vector初始化

一维vector

以一个长为10,元素种类为int的名为S的vector为例。一维vector初始化的基本格式是

1
2
3
4
5
6
vector<int> S; 			// 初始化一个一维向量S
vector<int> S(10); // 初始化一个长为10的向量S
vector<int> S(10, 1); // 初始化一个长为10,初始值为1的向量S
vector<int> a(10, 1);
vector<int> S(a); // 用向量a初始化向量S(两向量必须类型相同)


第一种初始化方法,即vector<int> S,初始化后vector为空,容器中没有元素,size为0,并且此时capacity也为0,表明并没有为S分配内存空间。
另外也可以用数组初始化vector:
1
2
3
int n[] = {1, 2, 3, 4, 5};
vector<int> a(n, n+5); //将数组n的前5个元素作为向量a的初值
vector<int> a(&n[1], &n[4]); //将n[1] - n[4]范围内的元素作为向量a的初值

多维vector

多维向量的初始化可以用嵌套定义的方式,指定每一维的长度。例如,初始化一个大小为XSIZE*YSIZE*ZSIZE,初始值全部为0的三维向量S:
vector<vector<vector<int> > > S(XSIZE,vector<vector<int> >(YSIZE,vector<int>(ZSIZE, 0)));
这里需要注意,最好在>之间加上空格,以免被误认为是操作符”>>”。

另一种初始化方法,是先声明一个空的三维向量,再对各维分别resize:

1
2
3
4
5
6
7
8
vector<vector<vector<int> > > S;
S.resize(XSIZE);
for (int i = 0; i < XSIZE; ++i) {
S[i].resize(YSIZE);
for (int j = 0; j < YSIZE; ++j){
S[i][j].resize(ZSIZE);
}
}

vector的几种重要操作

遍历

对vector中某一个元素进行操作,可以直接像普通数组一样使用[]进行下标索引。例如S[2][3][4],但是这里要注意,下标操作只能获取已存在的元素,不可用于添加元素等。

以打印三维向量vec所有元素为例,说明两种遍历方式。

1
vector<vector<vector<int>>> vec;

第一种是利用下标索引,通过size()函数获取每一维的长度。

1
2
3
4
5
6
7
8
9
10
11
12
int i,j,k;
for (i = 0; i < vec.size(); i++)
{
for(j = 0; j < vec[0].size(); j++)
{
for (k = 0; k < vec[0][0].size(); k++)
{
cout << vec[i][j][k] << " ";
}
cout << endl;
}
}

第二种是采用vector的迭代器,用iterator的begin和end获取每一维的起始和终止位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vector<int>::iterator it;
vector<vector<int>>::iterator it2;
vector<vector<vector<int>>>::iterator it3;
vector<int> vec_tmp;
vector<vector<int>> vec_tmp2;

for(it3 = vec.begin(); it3 != vec.end(); it3++)
{
vec_tmp2 = *it3;
for(it2 = vec_tmp2.begin(); it2 != vec_tmp2.end(); it2++)
{
vec_tmp = *it2;
for(it = vec_tmp.begin(); it != vec_tmp.end(); it++)
cout << *it << " ";
cout << endl;
}
}

添加元素

vec.push_back(t) 在容器的最后加入一个值为t的数据,容器的size变大
vec.insert(p, t) 在指针p指向的元素之前插入一个值为t的元素,返回指向新添加元素的指针
vec.insert(p, n, t) 在指针p指向的元素之前插入n个值为t的元素,返回指向新添加元素中第一个元素的指针

删除元素

vec.pop_back() 删除容器中最后一个元素
vec.erase(p) 删除指针p指向的元素,返回指向p后一个元素的指针
vec.erase(p1, p2) 删除指针p1到p2之间的元素
vec.clear() 删除容器中全部元素

其他操作

vec.empty() 判断是否为空
vec.size() 返回容器中数据的个数