目录
vector:动态数组
1、基本介绍
vector为可变长数组,即动态数组,定义的vector数组可以随时添加和删除元素。
在局部函数中创建的vector数组是在对空间里面创建的,与全局变量比较类似,所以常见其再局部函数中开辟大容量数组。
vector的数据安排以及操作方式,与array非常相似,两者的唯一差别在于空间的运用的灵活性。
Array是静态空间,一旦配置了就不能改变,如果要重新改变大小,首先要配置一块新的空间,然后将旧空间的数据搬到新开辟空间,再释放原来的空间。
Vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。因此vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,不必害怕空间不足而一开始就开辟一个很大空间的array了。
头文件
#include<vector>
1.1、初始化
<1> 一维初始化
vector<int> v; //定义了一个名为v的储存数据类型为int的一维数组
vector<double> v; //定义了一个名为v的储存数据类型为double的一维数组
vector<node> v; //定义了一个名为v的储存数据类型为node的一维数组
- 指定长度和初始值的初始化
vector<int> v(n); //定义一个长度为n的数组,动态定义,不指定初值默认初值为0
vector<int> v(n, 0); //所有的元素均为0
//注意:指定数组长度之后数组就相当于普通的数组了
- 初始化中有多个元素
vector<int> a{1, 2, 3, 4, 5};// 数组a中有五个元素
<2> 二维初始化
- 定义第一维固定长度为
5
,第二维可变化的二维数组
vector<int> v[3]; //定义可变长二维数组
//此时行不可变,但列可变,一维长度不可变为3,二维可变
- 定义动态二维数组(行列均可变)
vector<vector<int>> v; //定义了一个行列均可变化的二维数组
- 定义行长度
n + 1
,列长度m + 1
,初始值为0 的二维数组
vector<vector<int>> v(n+1,vector<int>(m+1,0));
1.2 、元素的访问方法
<1> 单个访问(可以按照下标访问)
cout << v[4] << endl; //输出第五个数据
//一二维可变数组和普通数组的访问方法一样
<2> 循环访问(可以按照下标访问)
for(int i = 0; i < v.size(); i++){
cout << v[i] << " ";//下标范围在[0,v.size()),前开后闭
}
<3> 智能指针
for(auto i : v) {
cout << i << " ";
}
2、方法函数
如何添加、删除、修改数据
相关的函数如下:
下例中,v指代为数组名
v.front(); //返回第一个数据O(1)
v.back(); //返回最后一个数据O(1)
v.pop_back(); //删除最后一个数据O(1)
v.push_back(element); //在数组尾部添加一个数据
v.size(); //返回数组元素个数O(1)
v.clear(); //清除数组
v.resize(n,num); //改变数组大小为n,n个空间数值赋值为num,默认为0
v.insert(it.num); //向任意迭代器it插入一个元素x
v.insert(c.begin()+2,-1);//将-1插入到v[2]的位置
v.erase(first,last); //删除[first,last)的所有元素
v.begin(); //返回首元素的迭代器
v.end(); //返回最后一个元素的后一个位置的迭代器
v.empty(); //判断是否为空,为空返回真,反之为假
注: end()返回的是最后一个元素的后一个位置的地址,不是最后一个元素的地址,所有容器均适用
3、注意事项
3.1、 排序
使用sort排序:
sort(v.begin(),v.end());
对所有元素排序,如果对指定区间进行排序,可以对sort()里面的参数进行修改
3.2、 访问
数组访问
<1> 下标访问
<2> 迭代器访问
vector<int> vi; //定义一个vi数组
vector<int>::iterator it = vi.begin();//声明一个迭代器指向vi的初始位置
//添加元素
for(int i = 0; i < 5; i++){
vi.push_back(i);
}
//下标访问
for(int i = 0; i < 5; i++){
cout << vi[i] << " ";
}
<3> 智能指针
注:只能从头到尾遍历全部数组,如果要对指定内容进行遍历要选择其他方法
vector<int> v;
v.push_back(1);
v.push_back(2);
for( auto i : v) {
cout << i << " "; // 1 2
}
总结:
vi[i]
和*(vi.begin() + i)
等价- 说明:只有
vector
和string
的stl容器支持*(it + i)
的元素访问