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

【C++语言】vector

一、vector 的介绍和使用

1.1 vector的介绍

vector 是表示可变大小数组的序列容器。

就像数组一样,vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,他的大小是可以动态改变的,而且他的大小会被容器自动处理。

本质上来说,vector使用动态分配数组来存储他的元素。当新的元素插入的时候,这个数组需要被重新分配大小。为了增加存储空间,其做法是:分配一个新的数组,然后将全部的元素移动到这个新的数组中。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。

vector分配空间的策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。

因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。

与其他动态序列容器相比(deque,list和forward_list),vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其他不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用好。

1.2 vector 的使用

在使用这些STL的时候,我们也需要学会看文档!!!

1.2.1 vector的定义

1.2.2 vector iterator的使用

1.2.3 vector的空间增长问题

  • reserve只负责开辟空间,如何确定知道需要使用多少空间,reserve可以缓解vector增容的代价缺陷问题
  • resize在开空间的同时还会进行初始化,影响size 

1.2.4 vector的增删查改

1.2.5 vector迭代器失效问题

迭代器是主要作用就是让算法能够不用关心底层数据结构,其底层结构是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T*,因此迭代器失效,实际就是迭代器对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器程序可能会崩溃)。

对于vector可能会导致其迭代器失效的操作有:

  1. 会引起其底层空间改变的操作,都有可能是迭代器失效,比如:resize,reserve,insert,assign,push_back等
  2. 指定位置元素的删除操作——erase
  3. 注意:Linux下,g++编译器对迭代器失效的检测并不是非常严格,处理也没有vs下极端
  4. 与vector类似,string在插入 + 扩容 + erase之后,迭代器也会失效

迭代器失效解决方法:在使用前,对迭代器重新赋值即可。 

二、vector 深度剖析以及模拟实现

2.1 std::vector的核心框架接口的模拟实现 bit::vector

2.2 使用memcpy的拷贝问题

  • memcpy是内存的二进制格式拷贝,将一段内存空间中的内容原封不动的拷贝到另外一段内存空间中
  • 如果拷贝的是内置类型的元素,memcpy即高效又不会出错,但是如果拷贝的是自定义类型元素,并且自定义类型元素中涉及到资源管理时,就会出错,因为memcpy的拷贝实际是浅拷贝。

如果对象涉及到资源管理时,千万不能使用memcpy进行对象之间的拷贝,因为memcpy是浅拷贝,否则可能会引起内存泄露甚至程序崩溃。

2.3 动态二维数组的理解

vector<vector<int>> vv(0, vector<int>(10));

 

相关文章:

  • 如何在vscode中编译linux中的c++文件
  • 广西建筑安全员C证考试的报名时间和考试时间是什么时候?
  • 大模型应用(一):RAG
  • 【redis】list类型:基本命令(上)
  • 深入浅出:HTML 中 <a> 标签嵌入链接教程
  • 并行算法_第十章_《C++并发编程实战》笔记
  • 创客匠人创始人IP变现大课将于3月在成都举办 助力知识付费转型
  • redis数据库
  • Seq2Seq:让机器学会同声传译的魔法架构
  • 上下文微调(Contextual Fine-Tuning, CFT)提高大型语言模型(LLMs)在特定领域的学习和推理能力
  • ​2024华为OD机试真题-太阳能板最大面积(C++)-E卷B卷-100分
  • MySQL 企业版 TDE加密后 测试和问题汇总
  • 切换数据库连接池
  • OpenBMC:BmcWeb 处理http请求
  • Tomcat 安装
  • FX-std::set
  • LLM的准确率评估采用什么方式:准确率评估使用的是 `sklearn.metrics` 模块中的 `accuracy_score` 函数
  • 日常开发记录-radioGroup组件
  • 【并发编程】JUC常用类以及线程池
  • 在Simulink中将Excel数据导入可变负载模块的方法介绍
  • 沧州企业网站优化/百度网址收录提交入口
  • 2015百度推广网站遭到攻击/软文是指什么
  • 天津装修公司排名前十名/网站seo推广营销
  • 怎么用dw英文版做网站/seo短视频入口引流
  • python不用框架做动态网站/seo外包大型公司
  • 太原站建设有多长时间/seo快速排名利器