c++:vector

一、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统一的迭代器和引用更好。

1.2 vector的使用

1.2.1 vector的定义

(constructor)构造函数声明

接口说明

vector()(重点)

无参构造

vector(size_type n, const value_type& val = value_type())

 构造并初始化n个val

vector (const vector& x); (重点)

拷贝构造

vector (InputIterator first, InputIterator last);

使用迭代器进行初始化构造

1.2.2 vector iterator 的使用

iterator的使用

接口说明

begin +end(重点)

获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置的iterator/const_iterator

rbegin + rend 

获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator

 

1.2.3 vector 空间增长问题

容量空间

 接口说明

size

获取数据个数

capacity

获取容量大小

empty

判断是否为空

resize(重点)

 改变vector的size

reserve (重点)

改变vector的capacity

  • capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。
  • vs是PJ版本STL,g++是SGI版本STL。
  • reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。
  • resize在开空间的同时还会进行初始化,影响size。

1.2.4 vector 增删查改

vector增删查改

接口说明

push_back(重点)

 尾插

pop_back (重点)

 尾删

find 查找。

(注意这个是算法模块实现,不是vector的成员接口)

insert

在position之前插入val

erase

删除position位置的数据

swap

交换两个vector的数据空间

operator[] (重点)

像数组一样访问

 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之后,迭代器也会失效

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


总结

vector就像是数组的进阶版,想要学会vector最好模拟实现一下vector.

蟹蟹观看!点赞!关注!收藏!评论!一键三连!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一键切换暗黑模式,这些代码片段你不可错过

文章目录 前言正文1.多主题切换2.使用 SASS 实现轻松深色模式3.动画切换浅色与深色模式4.纯 CSS 主题切换5.GitHub 风格的深色模式切换6.持久深色模式7.基本 Vue 响应式切换8.创意灯泡切换 总结 前言 如今,许多网站设计师都会为用户提供浅色和深色模式的选择。这不…

雷军救WPS“三次”,WPS注入新生力量,不再“抄袭”微软

救WPS“三次” 1989年,求伯君用128万行代码编写出了WPS1.0,宣告了中国自主办公时代的开启。 那时候,雷军还在武汉大学深造,他早就把求伯君当成了自己的榜样,这一来二去的,雷军和WPS之间也就结下了不解之缘…

[MySQL#10] 索引底层(1) | Page | 页目录

目录 1. 初识索引 2. 认识磁盘 3. MySQL与磁盘交互基本单位 4. 索引的理解 1. 重谈Page 2. 为什么IO交互要用Page 3. 有主键的表插入数据时的排序 4. 单个Page与多个Page 4.1 单个Page 4.2 多个Page 目录 单Page目录 多Page目录 在看本文之前,可以回顾…

sklearn 实现随机森林分类器 - python 实现

python sklearn 实现随机森林分类器 from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris # 加载数据集 irisload_iris() x,yiris.data,iris.target print("x y shape:",x.shape,y.shape) # 创建并训练模型 model Random…

Altium Designer使用技巧(二)

一、创建类 1、按DC键,打开对象类。 2、右键添加一个类。命名为PWR。 3、将所有的电源类,全部添加到新创建的类中,从非成员类中点选到成员类中。 4、右下角点panes ,点PCB。 5、然后在左边单击PWR,点连接,可显示或…

<十六>Ceph mon 运维

Ceph 集群有故障了,你执行的第一个运维命令是什么? 我猜测是ceph -s 。无论执行的第一个命令是什么,都肯定是先检查Mon。 在开始之前我们有必要介绍下Paxos协议,毕竟Mon就是靠它来实现数据唯一性。 一: Paxos 协议 1…

NPOI 操作详解(操作Excel)

目录 1. 安装 NPOI 2. 使用 NPOI 创建新 Excel 文件 3. 设置列宽和行高 1. 设置列宽 2. 设置行高 3. 同时设置列宽和行高 4. 设置统一的行高 5. 设置统一的列宽 6. 应用统一的行高和列宽 4. 合并单元格 5. 设置单元格样式(字体、边框、背景色等&#xf…

多处理机调度(李昂学长视频总结)25新增考点

多处理机定义:多处理机指的是某个计算机系统中有多个cpu,在多处理机调度中,多处理机一般指的是共享存储器处理机,其两个或更多的cpu全部共享一个公用的RAM。 根据系统中的处理机相同与否,可将多处理机系统分为如下两类…

少儿编程培训市场突破500亿元:教育新蓝海的崛起与未来展望

近年来,随着科技的迅速发展和家长对教育方式的重视,少儿编程市场成为一片新的蓝海。据最新市场调研报告显示,2024年中国少儿编程培训市场规模已突破500亿元,预计未来五年将持续增长。这一趋势反映了少儿编程教育的迅速崛起&#x…

【大数据学习 | kafka】producer的参数与结构

1. producer的结构 producer:生产者 它由三个部分组成 interceptor:拦截器,能拦截到数据,处理完毕以后发送给下游,它和过滤器不同并不是丢弃数据,而是将数据处理完毕再次发送出去,这个默认是不…

【论文速读】Optimization-based Prompt Injection Attack to LLM-as-a-Judge

基于优化的提示词注入攻击 摘要引言问题描述LLM-as-a-judge威胁模型攻击者知道什么 JUDGEDECEIVER 细节概述生成影子候选回复公式化为优化问题Target-aligned generation lossTarget-enhancement lossAdversarial perplexity loss优化问题 求解优化问题 摘要 LLM-as-a-Judge 利…

人工智能证书合集

本文将对目前市面上主流官方机构颁发的人工智能证书进行整理和介绍,由于整理的证书较多,本文共一万八千多字,请根据自己的考证需求阅读对应部分的内容,希望本文对人工智能行业的从业人员和计划从事人工智能相关岗位工作的人员有所…

Java入门8——二维数组

今天的内容算是数组的收尾~~ 从下次开始就要开始学习类和对象了,冲冲冲! 首先二维数组,也很好理解,就是把几个一维数组拼在一起了,我们用代码来熟悉一下~ public class javaSchool {public static void main(String[…

自动售饮料机控制电路的设计

自动售饮料机控制电路的设计 1 设计目的 (1)熟悉数字电路的应用。 (2)掌握常常利用逻辑运算器及D触发器的逻辑功能及利用方式。 (3)熟悉电路仿真软件Multisim 利用。 (4)了解自动售饮…

高速高精运动控制解决方案亮相2024 NEPCON亚洲电子展!

■展会名称: NEPCON ASIA 2024 亚洲电子生产设备暨微电子工业展览会(以下简称“亚洲电子展”) ■展会日期 2024年11月6 -8日 ■展馆地点 中国深圳国际会展中心(宝安) ■展位号 11号馆-11A24 11月6日至8日,亚洲电子展将在中…

Flask轻松上手:从零开始搭建属于你的Web应用

目录 一、准备工作 二、安装Flask 三、创建你的第一个Flask应用 创建一个新的Python文件 编写Flask应用代码 运行Flask应用 四、创建一个简单的博客系统 定义路由和文章列表 创建模板文件 运行并测试博客系统 五、使用数据库存储用户信息 安装Flask-SQLAlchemy 修…

STM32开发 —— 新工程创建思路终于清晰了

目 录 工程创建三步法一、工程文件夹创建二、管理工程项三、配置工程参数 工程创建三步法 从ST官网下载好stm32标准库或HAL库,HAL库目录如下。 在Keil开发环境中创建STM32工程,分三大步即可完成工程的创建: 一步:在本地磁盘创建…

Java SpringBoot调用大模型AI构建AI应用

本文是一个用springboot 结合spring mvc 和spring ai alibaba 调用国产大模型通义千问的具体例子,按照这个做能够快速的搞定Java应用的调用。 然后就可以把这类应用泛化到所有的涉及到非结构化数据结构化的场景中。 Spring AI:简化Java中大模型调用的框…

【办公类-04-04】华为助手导出照片视频分类(根据图片、视频的文件名日期导入“年-月-日”文件夹中,并转移到“年-月”文件中整理、转移到“年”文件夹中整理)

背景需求 最近带班,没有时间整理照片,偶尔导一次,几个月的照片。发现用电脑版“华为手机助手“中的WLAN连接”与华为手机的“华为手机助手”连接,速度更快、更稳定,不会出现数据线连接时碰碰就断网的问题 1、先打开电…

电脑没有下载声卡驱动怎么办?电脑声卡驱动安装方法

在日常使用电脑的过程中,我们可能会遇到电脑没有声音的问题,这往往与声卡驱动缺失或损坏有关。声卡驱动是连接电脑硬件(声卡)与操作系统之间的桥梁,确保音频信号能够正常输入输出。那么,当电脑没有声卡驱动…