vector是c++标准库中的一种顺序容器。顺序容器的类型有以下几种:
- vector 可变大小数组
- deque 双端队列
- list 双向链表
- forward_list 单向链表
- array 固定大小数组
- string 与vector相似的容器,专门用于字符串
其中,string
和vector
将元素保存在连续的内存空间中,因此利用下标随机访问元素非常快,但是在中间位置插入或删除元素很慢。list
和forward_list
在任何位置插入或删除元素都很快,但都不支持元素的随机访问。为了访问一个元素需要遍历整个容器。deque
是一个更为复杂的数据结构,与string和vector类似,deque支持快速的随机访问
vector初始化
一维vector
以一个长为10,元素种类为int的名为S的vector为例。一维vector初始化的基本格式是1
2
3
4
5
6vector<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
3int 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
8vector<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 | int i,j,k; |
第二种是采用vector的迭代器,用iterator的begin和end获取每一维的起始和终止位置。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17vector<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()
返回容器中数据的个数