【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)

最后,如果你喜欢这篇文章,请给作者点个小小的免费的赞叭

球球辣~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

起床气233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值