1. Vector的简介
vector虽然名为'向量',但是其本质是一个不定长数组,不仅如此,一些对数组进行常用操作也是被STL一起封装在了vector类型的内部,可以直接调用相应函数。
优点:节省内存空间
缺点:太麻烦了
在存放类型相同的大数据时,我们目前做法是定义数组。例如:int a[n]。这种定义方法要求是先确定数组的长度, 即N必须是常量。在解题和实际应用中,我们很难提前确定有多少组数据,因此一般会将数组长度设定为可能的最大值,这就容易造成极大的空间浪费。相同的操作,如果用stl中的Victor就能轻便的多:先定义vector<int> a。然后就可以直接在现有的数据的末尾添加新数据,并随时获取数组当前的长度。
2. Vector的用法
先导用Vector的头文件——就是Vector。
#include <vector>
随后我们可以用vector定义数组a,这里就有很多方式:
vector<int> a; // a是一个空的1维整型
vector<int> b = {1,2,3,4,5}; // B相当于有五个元素都赋值了初始的一维整型数组。这一语句在老版本C中会报错,因此不推荐使用。
vector<int> c(5); // C相当于有五个元素,且默认初始化为零的一维整型数组。
vector<int> d(5,-1); // d相当于有五个元素,且默认初始化为-1的一维整型数组。
vector<vector<int> > e; //e相当于空的二维整型数组。注意两个">"之间有一位空格,不加空格的话可能会被一些编译器识别为输入时。用到的">>".
接下来如何往vector里面添加数据元素呢?最常用的是push_back函数。元素会被自动添加到数组尾部,比如下面的循环动态数组a将被扩展为十位,第i位存放的数字是i+1。
for (int i = 1; i <= 10; i++){
a.push_back(i);
}
访问vector中的数据时,可以像传统数组一样用a[i]表示第i位的值。比如通过下面的循环,我们就将动态数组a中的全部元素都输出了一遍。并且以空格分隔。
for (int i =0; i < a.size(); i++){
cout << a[i] << " ";
}
size是求a的长度
vector<int> aa;
aa[0] = 1; //注意,这是错误的。aa在定义之后是空的,并不存在第零位,因此数据1不会被存入aa中。
与push_back对应,还有用于删除vector末尾元素的函数pop_back这说明。 Vector在对数组末尾进行增减元素的操作时尤为高效。比如删除动态数组a的最后一位元素只需要写:
a.pop_back();
如果我们想删除动态数组中的任意一个位置,我们可以这样写:
a[0]:
a.erase(a.begin());
a[5]:
a.erase(a.begin()+4);
最厉害的是。 Erase可以删除一系列连续的数据:
删除0~5位
a.erase(a.begin(),a.begin()+4);