【C++】STL数据结构最全函数详解2-向量vector
关于STL,我们之前浅浅提过:这里
另外对于栈,这里有更加详尽的介绍:C++STL常用数据结构1详解---栈(stack)-CSDN博客
这个系列将会更加深入地从函数原型开始用详细的例子解释用法
首先这一篇介绍的是一个非常方便的、功能更强大的“动态数组”--vector
(有基础的朋友可以直接跳到后面看总结干货)
——————————————————————
作为STL数据结构,vector自然有自己的头文件:
#include<vector>
例:
#include<iostream>
#include<vector>
using namespace std;
int n;
vector<int> v;
int main()
{
cin >> n;
for(int i = 0; i < n; i++){
int t; cin >> t;
//v[i] = t;
v.push_back(t);
}
for(int i = 0; i < n; i++)
cout << v[i] << ' ';
cout << endl;
return 0;
}
在第6行,我们定义了一个存储int的向量v:
定义格式:vector<数据类型> 向量名(初始大小);
//初始大小以及括号可以不加
在14行,我们向这个向量里添加了元素t。push_back即把该元素添加至向量末尾。
当然,向量与数组类似,支持随机访问。如第13行直接修改值和17行访问都是合法的。
至于更进阶的用法……
#include<iostream>
#include<vector>
using namespace std;
int n, m, u, v;
vector< vector<int> > e;
int main()
{
cin >> n >> m;
for(int i = 0; i < m; i++){
cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);
}
return 0;
}
我们在这里的第六行定义了向量套向量的e来存储图(邻接表)
在main函数的for循环中,我们依次读入m条边,在u,v两个结点之间连接一条无向边。
优点与特性
这样说下来,有的朋友就要问了:
向量就这?我用数组加计数器也能实现啊!
那向量有什么特别之处吗?
欸!还真有!
细心的小伙伴可能发现了,我们在使用向量时没有设置初始大小。
这是因为,向量采用的是动态分配内存!
下面是我们使用push_back和随机访问修改时的场景:
for(int i = 1; i <= 1023; i++){
v.push_back(114514);
cout << v.capacity() << ' ';
//输出vector所占用的实际空间
}
输出:
第1次:没逝,稳得很!1的初始空间刚好能装下!
第2次:啊啊啊~~超出上限了,要长脑子了!
(容量增加到2) 总算能装下了……
第3次:c,怎么天天往里放东西啊?!好烦,干脆一次性再长两个脑子吧……(容量增加到4)
第5次:又放不下了……这次我多开一点空间,不然真的好累……
稍微卑微一点,开个两倍空间足矣!(容量增加到8)
………………
大家也能明显地发现,每当空间不够用时,vector都会申请一倍多余的空间。
所以,大家使用vector时基本可以不用担心数据存不下的问题了!
函数总集(全是干货!!!)
vector<int> v; <---主角
v.back() --- 返回末项的值
v.front() --- 返回首项的值
v.begin() --- 返回向量首地址
v.end() --- 返回向量末尾地址
v.clear() --- 清空向量(注意这里只是删除元素,空间仍然会被占用!!!)
v.capacity() --- 返回向量实际占用的空间
v.size() --- 返回向量中元素的个数
v.empty() --- 向量是否为空
v.push_back() --- 向末尾添加元素
v.pop_back() --- 弹出末尾元素
总结
总的来说,vector虽然和它的名字(向量)没什么关系
但它可以用倍增的方式拓展存储空间,
相较于传统的数组更加灵活,不必预先设置大小……
那么今天的内容暂时先到这里
(最近在自学unity,有点忙qwq)
最后,如果你喜欢这篇文章,请给作者点个小小的免费的赞叭
球球辣~~