当前位置: 首页 > news >正文

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

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

球球辣~~


http://www.mrgr.cn/news/28558.html

相关文章:

  • 解决背景图因为图片路径中携带括号导致图片无法显示的问题
  • Ubuntu 20.04配置ollama并下载安装调用本地大语言模型
  • 如何禁用VMware虚拟网卡
  • Python 占位语句 pass
  • 重学 Android 自定义 View 系列(六):环形进度条
  • Spring Boot中的自动装配机制
  • 【智路】智路OS 应用开发
  • 嵌套类问题的递归解题套路
  • Java中Redis大Key的优化拆分方案与示例
  • 【C++算法】位运算
  • 基于web的超市管理系统设计与实现
  • MySQL record 05 part
  • Go语言并发编程之select语句详解
  • Linux memcg lru lock提升锁性能
  • 【Python爬虫系列】_023.关于视频爬取
  • ​FullCalendar:强大的JavaScript事件日历
  • 【深度学习|可视化】如何以图形化的方式展示神经网络的结构、训练过程、模型的中间状态或模型决策的结果??
  • 【雅特力AT32】时钟配置-延时阻塞函数-软件定时器 时钟源与源码分析
  • SOMEIP_ETS_112: SD_Empty_Option
  • 【C++学习】 IO 流揭秘:高效数据读写的最佳实践
  • 火语言RPA流程组件介绍--浏览器页面操作
  • Qt多元素控件——QTableWidget
  • Go小专栏 第一期
  • PostgreSQL的表压缩
  • 【C++题解】1997. 孤独的素数
  • ChatGPT有三个快捷指令和三个模式,你知道吗?