精讲vector动态数组
2025-08-30 21:46:23
发布于:浙江
在刷题时,我们难免会遇到用普通数组难以解决题目的时候,例如:空间浪费太大(尤其是储存图时)、插入单个或多个元素时、删除单个或多个元素时……这时,我们可以使用动态数组vector,来帮忙缩短代码,提升运行效率。那本期,我们就由基础开始讲。
一、定义
在使用vector前,我们应先导入头文件,即:
#include<vector>
导入后,即可定义。格式为vector<DataType> 数组名(长度);
,例如:
vector<int> v(105);
长度也可不写,即数组为空 ,当然,当心喜提RE。例如:
vector<int> v;
同时,这里还有一个小技巧。如果定义时想让数组全部赋值为同一元素,告别for
和memset()
!直接在长度后面跟上要赋值的元素即可!例如:
vector<string> v(105,"NoonMaple"); //午枫老师我真的不是故意的
二、访问
其实与普通数组相同,格式为数组名[下标]
,例如:
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v(10);
for(int i=0;i<5;i++) cin>>v[i];
for(int i=0;i<5;i++) cout<<v[i]<<' ';
return 0;
}
三、插入
1.尾部插入
可使用vector内置的 push_back() 函数,格式为v.push_back(a)
,如:
v.push_back(5); //在v的尾部插入元素5
2.中间插入
可使用vector内置的 insert() 函数,格式为v.insert(v.begin()+idx,a)
,如:
v.insert(v.begin()+3,5); //在v下标为3的位置插入元素5
如果想插入多个:
v.insert(v.begin()+3,{1,1,4,5,1,4}); //从v下标为3的位置开始依次插入1,1,4,5,1,4
四、删除
1.尾部删除
可使用vector内置的 pop_back() 函数,格式为v.pop_back()
,如:
v.pop_back(); //删除最后一个函数
2.中间删除
可使用vector内置的 erase() 函数,格式为v.erase(v.begin()+idx)
,如:
v.erase(v.begin()+3); //删除v中下标为3的元素
如果需要区间删除(取头不取尾):
v.erase(v.begin()+3,v.begin()+5); //删除下标3~4的元素
五、排序
sort()基本应该都会,那不多说了
sort(v.begin(),v.end(),cmp); //cmp是自定义函数。注意一定是迭代器,跟原始数组不同!
六、查找
可使用算法库中的 find() 函数,需先导入 algorithm,即:
#include<algorithm>
find() 函数格式为find(v.begin(),v.end(),a)
,返回值为一个迭代器。如果没有在 中查找到 元素,它会返回v.end()
,由此可编译以下局部代码:
//查找v中是否有变量a这个元素
auto it=find(v.begin(),v.end(),a);
if(it==v.end()) cout<<"NO"; //不存在
else cout<<"YES";
可如果我们想知道这个元素的下标呢?我们可以使用 distance() 函数:
//查找v中变量a这个元素的下标
auto it=find(v.begin(),v.end(),a);
if(it==v.end()) cout<<"NO"; //不存在
else cout<<distance(v.begin(),it); //输出a所在的下标
七、其他美妙的小函数
1.v.clear(); //清空所有数据
2.v.size(); //获取数组长度
3.v.empty(); //判断数组是否为空
4.v.begin(); //数组第一个有效数据位置的迭代器
5.v.end(); //数组最后一个有效数据位置 +1 的迭代器
......
欢迎大家在下面为本贴留言补充!
全部评论 4
d
昨天 来自 浙江
0总结:vector nb,用vector
4天前 来自 上海
0附议
4天前 来自 浙江
0
d
5天前 来自 浙江
0告别for和memset(),直接使用fill()!!!!
1周前 来自 广东
01周前 来自 浙江
0(大惊)fill()你都不知道
1周前 来自 广东
0自己上网查吧
1周前 来自 广东
0
有帮助,赞一个