一、基本原理
vector内部使用动态数组的方式实现的,这个数组的元素可以是基本数据类型(如int、char、double等),也可以是类类型(如C++容器库里的string,或者你自定义的类)的。
初始化时,vector会申请比当前要容纳元素所需的内存更大一块的连续内存,预留出空闲空间,用于之后存放新添加的元素,这样就不需要每添加一个新元素就重新分配整个容器的内存空间。当不断向数组内添加元素时,如果数组的内存不够了,就要重新申请一块内存,一般是当前大小的两倍,然后把原数组的内容拷贝过去。
vector和普通数组一样都支持随机访问,但当在数组中头部或者中间添加或删除元素时,都要移动数组元素,如果频繁地进行这样的操作,会导致vector性能降低。
vector的一个特点:内存空间只会增长,不会减小。除非你用vector中的shrink_to_fit()函数来人为地减小预分配空间,但是调用shrink_to_fit()也并不保证一定退回内存空间。
二、用法
以下都以容器vector中的元素为int为例,若要保存其他类型的元素,将int换成其他类型即可。
初始化
创建一维数组的方法 | vector<类型名> 数组名; |
---|---|
vector<int> v1; | 创建一个名为v1的空数组,v1中的元素类型为int |
vector<int> v1(100,7); | v1中的元素为100个7 |
vector<int> v1{1,2,3,……}; | 元素为1,2,3,……的v1 |
vector<int> v2(v1); | 数组v2中包含和数组v1一样的元素 |
vector<int> v2=v1; | 数组v2中包含和数组v1一样的元素 |
创建二维数组 | vector<vector<类型名> > 数组名; |
---|---|
vector<vector<int>> v1; | 创建一个名为v1的空数组,v1中的元素类型为vector<int> |
vector<vector<int>> v1(5,vector<int> (100,7); | 创建一个5行100列的二维数组 ,数字中的元素都为7 |
vector<vector<int>> v1{ {1,2} ,{3,4,5,6,7} }; | 第一行元素为1,2,第二行元素为3,4,5,6,7的数组v1 |
访问元素
访问元素 | |
---|---|
v1[n] | 访问下标为n的那个元素 |
v1.at(n); | 访问下标为n的那个元素 |
v1.front(); | 访问v1的首元素 |
v1.back(); | 访问v1的尾元素 |
*iter | 访问迭代器iter指向的元素 |
获取迭代器 | |
---|---|
v1.begin(); | 获取指向v1首元素的迭代器 |
v1.end(); | 获取指向v1尾元素的后一个位置的迭代器 |
v1.rbegin(); |