vector(介绍)

news/2024/11/18 4:20:22/

目录

1.vector的介绍及使用

1.1 vector的介绍

1.2 vector的使用

1.2.1 vector的定义

1.2.2 vector iterator 的使用 

 1.2.3 vector 空间增长问题

1.2.4 vector 增删查改

1.2.5 vector 迭代器失效问题。(重点)

2.vector深度剖析及模拟实现

 

 2.1 使用memcpy拷贝问题

2.2 动态二维数组理解


1.vector的介绍及使用

1.1 vector的介绍

1. vector 是表示可变大小数组的序列容器。
2. 就像数组一样, vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对 vector 的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
3. 本质讲, vector 使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector 并不会每次都重新分配大小。
4. vector 分配空间策略: vector 会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
5. 因此, vector 占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
6. 与其它动态序列容器相比( deque, list and forward_list ), vector 在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list forward_list 统一的迭代器和引用更好。
使用 STL 的三个境界:能用,明理,能扩展 ,那么下面学习 vector ,我们也是按照这个方法去学习

1.2 vector的使用

vector 学习时一定要学会查看文档: vector 的文档介绍 vector 在实际中非常的重要,在实际中我们熟悉常见的接口就可以,下面列出了哪些接口是要重点掌握的

1.2.1 vector的定义

1.2.2 vector iterator 的使用 

iterator 的使用 接口说明
begin + end (重点)
获取第一个数据位置的 iterator/const_iterator , 获取最后一个数据的下一个位置
iterator/const_iterator
rbegin + rend
获取最后一个数据位置的 reverse_iterator ,获取第一个数据前一个位置的
reverse_iterator

 1.2.3 vector 空间增长问题

 

capacity 的代码在 vs g++ 下分别运行会发现, vs capacity 是按 1.5 倍增长的, g++ 是按 2 倍增长的 。 这个问题经常会考察,不要固化的认为,vector 增容都是 2 倍,具体增长多少是根据具体的需求定义的。vs PJ 版本 STL g++ SGI 版本 STL
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

erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是没有元素的,那么pos就失效了。因此删除vector中任意位置上元素时,vs就认为该位置迭代器失效了。

3. 注意:Linux下,g++编译器对迭代器失效的检测并不是非常严格,处理也没有vs下极端

4. vector类似,string在插入+扩容操作+erase之后,迭代器也会失效

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

2.vector深度剖析及模拟实现

 

 2.1 使用memcpy拷贝问题

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

 

 

 

 

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

 

2.2 动态二维数组理解

构造一个 vv 动态二维数组, vv 中总共有 n 个元素,每个元素都是 vector
型的,每行没有包含任何元素,如果 n 5 时如下所示:

vv中元素填充完成之后,如下图所示:  

 

使用标准库中 vector 构建动态二维数组时与上图实际是一致的

 


http://www.ppmy.cn/news/1049932.html

相关文章

【SpringCloud】SpringCloudAlibaba官网资料

出现原因 Spring Cloud Netflix Projects Entering Maintenance Mode 官网 博客 https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md官网 https://spring.io/projects/spring-cloud-alibaba#overview英文 https://github.com/alibaba/spring-cloud-…

第12步---MySQL的JDBC操作

第12步---MySQL的JDBC操作 1.概述 采用Java API 的方式实现数据之间的操作。 根据不同的数据库采用了不同的驱动,接口是一致的。 下载的地址 MySQL :: Download MySQL Connector/J (Archived Versions) 2.执行流程 注册驱动 创建连接 执行sql语句的对象 结果…

中国省域-经济高质量发展水平2000-2021年(数据+dofile+综合指数)

以中国31个省级行政单位(不含港澳台)为研究对象,测度中国省域经济高质量发展 中国省域经济高质量发展测度结果, 有助于分析各地区经济高质量发展的优势和短板, 为改善地区经济高质量发展提供参考价值 一、数据介绍 数…

console的几个常用用法

console.log() 其一、主要表示:向 Web 控制台输出一条消息; 其二、而具体是什么信息就以传递的实参为准,然后就是在控制台就能显示自己传递参数的结果; console.log([1,3,5,7]) // 输出 [1, 3, 5, 7] console.log({}) // 输出 {} conso…

Unity 之 RaycastHit(存储射线投射操作)

文章目录 总述具体使用场景 总述 RaycastHit 类是 Unity 中的一个结构,用于存储射线投射操作的结果。射线投射是一种常用的技术,用于检测场景中的碰撞、获取碰撞点、获取碰撞对象的信息等。RaycastHit 提供了关于射线与场景中对象的交互信息&#xff0c…

8.4.tensorRT高级(3)封装系列-infer推理封装,输入输出tensor的关联

目录 前言1. infer封装总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-infer推理封装,输入输出…

AI提示语-让每个人都能轻松使用 AI,提高 10 倍生产力

AI提示语简介 无需代码,连接模型快速构建AI应用。让每个人都能轻松使用 AI,提高 10 倍生产力。 AI提示语介绍 AI 提示语致力于为各类AI应用搭建、运行和推广的基础平台,让广大用户都能将AI的力量运用到实际的工作与生活场景中。 AI提示语…

PyTorch DataLoader 报错 “DataLoader worker exited unexpectedly“ 的解决方案

注意:博主没有重写d2l的源代码文件,而是创建了一个新的python文件,并重写了该方法。 一、代码运行日志 C:\Users\Administrator\anaconda3\envs\limu\python.exe G:/PyCharmProjects/limu-d2l/ch03/softmax_regression.py Traceback (most r…