vector
1、介绍
vector为可变数组,即动态数组,定义数组时,可以随时添加数值和删除元素
//头文件
#include<vector>
初始化
vector<int>a;//定义了一个名为a的一堆数组,数组储存int类型数据
vector<double>b;//定义了一个名为b的一堆数组,储存浮点数据类型
vector<node>c;//定义了一个名为c的一堆数组,储存结构体数据类型
指定数组长度和初始值的初始化
vector<int>a(b);//定义一个名为a的一堆数组,长度为b,下标范围[0,b-1]
vector<int>c(d,1);//定义一个名为c的一堆数组,长度为d,初始化所有数据为1
拷贝初始化
vector<int>a(n,1);//先定义一个长度为n的数组a,初始化内容为1
vector<int>b(a);//两个数组 类型相同相同,长度相同,内容相同
二维动态数组
初始化
定义第一维固定长度为5,第二维可变化的二维数组
vector<int>a[5];//定义一个长度可变的二维数组,第一维固定长度为5,第二维长度可变
Ps:行数不可变,列数可变,和c语言中一般的二维数组刚好相反。
行和列均可变的数组
vector<vector<int>>a;//定义了一个行列长度均可变的二维数组
行和列均不变的数组
vector<vector<int>>a(n+1,vector<int>(m+1,0));//定义一个行为n+1,列为m+1初始值为0的数组
2、方法函数
vector<int>a;//首先先定义一个数组a;
函数代码 | 含义 | 复杂度 |
a.front() | 返回数组的第一个数据 | O(1) |
a.back() | 返回数组的最后一个数据 | O(1) |
a.pop_back() | 删除最后一个数据 | O(1) |
a.size() | 返回实际数据个数(unsigned类型) | O(1) |
a.push_back(element) | 尾部加一个数据 | O(1) |
a.clear() | 清除元素个数,N为元素的个数 | O(N) |
a.resize(n,v) | 改变数组大小为n,n个空间数值赋值为v,如果没有,默认赋值为零 | \ |
a.insert(item,x) | 向任意一个迭代器item插入一个元素x,例如a.insert(a.begin()+2,-1)将-1插入到a[2]的位置 | O(N) |
a.eerase(n,m) | 删除[m,n)的所有元素 | O(N) |
a.begin() | 返回首元素地址 | O(1) |
a.end() | 返回最后一个元素的后一个位置的地址 | O(1) |
a.empty() | 判断数组是否为空,空为真,否则为假 | O(1) |
sort | 排序函数,以后的文章会讲到 | \ |
访问方式
下标法:和普通数组一样通过0到a.size()-的下表进行访问
vector<int>a;
for(int i=0;i<4;i++){
a.push_back(i);
}
迭代器访问:类似指针一样的访问 ,首先需要声明迭代器变量,和声明指针变量一样。
vocter<int>a{0,1,2,3};
vector<int>::iterator item = a.begin();
for(int i = 0; i < 4; i++)
cout << *(item + i) << " ";
cout << "\n";
使用auto关键字:会遍历数组的所有元素
vector<int> a(n);
for (auto &x: a) {
cin >> x;
}
后续会对auto等关键字进行详细解释