当前位置: 首页 > 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.lryc.cn/news/439629.html

相关文章:

  • 阿里云 Quick BI使用介绍
  • LLMs之SuperPrompt:SuperPrompt的简介、使用方法、案例应用之详细攻略
  • Java中的Web服务开发:RESTful API的最佳实践
  • Linux创建虚拟磁盘并分区格式化
  • 面试经典150题——最后一个单词的长度
  • 【C++】入门基础(上)
  • Mac中Twig模版安装与SSTI漏洞学习
  • 【20.5 python中的FastAPI】
  • 研1日记13
  • Go语言错误处理详解
  • C++基础知识7 list
  • Android 车联网——汽车模块介绍(附1)
  • Windows下SDL2创建最简单的一个窗口
  • C++ | Leetcode C++题解之第406题根据身高重建队列
  • 【网络安全】-ssrf服务器请求伪造攻击-burp
  • C语言 | Leetcode C语言题解之第405题数字转换为十六进制数
  • Python快速入门 —— 第一节:基础类型
  • 评价类——熵权法(Entropy Weight Method, EWM),完全客观评价
  • Redis——通用命令
  • (k8s)kubernetes 挂载 minio csi 的方式(pod挂载pvc存在csi驱动问题,挂载不上)
  • python tkinter
  • Flink CEP(复杂事件处理)高级进阶
  • libmodbus:写一个modbusTCP服务
  • 函数模板(初阶)
  • 中间件之RocketMQ
  • linux第二课(docker的安装使用)
  • Java数据存储结构——二叉查找树
  • JavaScript 事件处理
  • 容器技术--Docker应用部署
  • 医院管理|基于java的医院管理系统小程序(源码+数据库+文档)