迭代器失效和支持随机访问的容器总结

 创作活动

 迭代器失效:

  1. 顺序容器(如vectordequelist
    • vector
      • 插入操作
        • 当在vector中间或头部插入元素时,所有位于插入点之后的迭代器都会失效。这是因为vector的元素在内存中是连续存储的,插入元素可能会导致内存重新分配和元素的移动。例如,有一个vector<int> v = {1,2,3,4,5};,如果执行v.insert(v.begin() + 2, 6);(在索引为 2 的位置插入 6),那么从v.begin()+2之后的迭代器(包括指向 3、4、5 的迭代器)都将失效。
        • 如果插入操作没有导致内存重新分配(例如在vector的尾部插入元素,且当前容量足够),那么只有指向插入位置的迭代器会失效。
      • 删除操作
        • 当删除vector中的元素时,所有指向被删除元素及其之后元素的迭代器都会失效。例如,对于vector<int> v = {1,2,3,4,5};,如果执行v.erase(v.begin() + 2);(删除索引为 2 的元素),那么指向 3、4、5 的迭代器都将失效。
    • deque
      • 插入操作
        • deque中间插入元素时,指向插入位置及其之后元素的迭代器会失效。deque是双端队列,它的内部实现是分段存储的,插入操作可能会导致部分元素的重新排列。例如,在一个deque中间插入元素后,该位置之后的元素可能会被移动到新的段或者在当前段内重新排列。
      • 删除操作
        • 删除deque中的元素时,指向被删除元素及其之后元素的迭代器会失效。和插入操作类似,因为元素的删除可能会导致剩余元素的重新排列。
    • list
      • 插入和删除操作
        • 对于list,插入和删除操作只会使指向被插入或删除元素的迭代器失效。这是因为list是链表结构,元素在内存中不是连续存储的。插入或删除一个节点只影响该节点及其相邻节点的链接关系。例如,有一个list<int> l = {1,2,3,4,5};,如果执行l.insert(l.begin() + 2, 6);(在第二个位置插入 6),只有指向原来第二个位置元素(2)的迭代器可能会失效(如果之前有保存该迭代器的话),其他迭代器仍然有效。同样,对于l.erase(l.begin() + 2);(删除第二个位置的元素),只有指向被删除元素的迭代器失效。
  2. 关联容器(如mapsetmultimapmultiset
    • 插入操作
      • 在关联容器中插入元素不会使已有的迭代器失效。这是因为关联容器(如红黑树实现的mapset)在插入新元素时,通过调整树的节点链接来保持平衡,而不会改变已有节点的地址。例如,对于一个map<int, int> m;,插入新的键值对后,之前获取的指向其他键值对的迭代器仍然有效。
    • 删除操作
      • 当删除关联容器中的元素时,只有指向被删除元素的迭代器会失效。因为删除一个节点只会影响该节点本身,而不会改变其他节点的地址。例如,在一个set<int> s = {1,2,3,4,5};中,执行s.erase(s.find(3));(删除元素 3),只有指向 3 的迭代器失效,指向 1、2、4、5 的迭代器仍然有效。
  3. 无序关联容器(如unordered_mapunordered_set等)
    • 插入操作
      • 一般情况下,插入元素不会使已有的迭代器失效。但是如果插入操作导致容器的哈希表进行了重新哈希(例如,当容器的负载因子超过一定阈值时),所有的迭代器都会失效。这种情况相对较少,但在使用时需要注意。
    • 删除操作
      • 删除元素时,只有指向被删除元素的迭代器会失效。和关联容器类似,因为删除一个桶中的元素通常不会影响其他桶中的元素和迭代器。例如,在一个unordered_set<int> us = {1,2,3,4,5};中,执行us.erase(3);,只有指向 3 的迭代器失效。

 支持随机访问的容器:

  1. 支持随机访问的容器
    • vector(动态数组)
      • 存储结构
        • vector在内存中是连续存储的元素序列,就像一个普通的数组。例如,vector<int> v = {1,2,3,4,5};在内存中是依次排列的,每个元素紧挨着前一个元素。这种连续存储方式使得它能够通过计算偏移量来快速访问元素。
      • 访问方式
        • 可以使用[]运算符或者at()函数进行随机访问。例如,要访问v中的第三个元素,可以使用v[2]或者v.at(2)(注意at()函数会进行边界检查,[]运算符不会)。这种访问方式的时间复杂度是,因为可以直接通过计算元素的内存地址来获取元素。比如,对于一个vector对象v,第n个元素的地址可以通过&v[0]+n来计算(在符合语法规则的情况下)。
      • 迭代器支持
        • vector的迭代器是随机访问迭代器,支持算术运算。例如,可以通过it + n或者it - n来移动迭代器n个位置,其中itvector的迭代器。这使得在遍历vector或者在其中进行元素查找等操作时更加灵活。比如,可以用vector<int>::iterator it = v.begin(); it += 3;来快速定位到v中的第四个元素(索引为 3)。
    • array(固定大小数组)
      • 存储结构
        • vector类似,array也是连续存储元素的容器。不过,array的大小在编译时就确定了,不能动态改变。例如,array<int, 5> a = {1,2,3,4,5};的大小始终是 5 个元素,并且在内存中是连续排列的。
      • 访问方式
        • 同样可以使用[]运算符或者at()函数进行随机访问,访问时间复杂度也是。例如,a[2]可以获取a中的第三个元素。因为其存储结构的连续性,计算元素地址的方式和vector类似。
      • 迭代器支持
        • array的迭代器也是随机访问迭代器,支持算术运算。例如,可以像操作vector的迭代器一样,通过it + n或者it - n来移动array的迭代器n个位置,方便对array中的元素进行遍历和操作。
  2. 不支持随机访问的容器
    • list(双向链表)
      • 存储结构
        • list是由一系列节点组成的双向链表。每个节点包含数据元素以及指向前一个节点和后一个节点的指针。例如,对于list<int> l = {1,2,3,4,5};,元素 1 的节点包含指向元素 2 节点的后向指针和nullptr(如果是头节点)的前向指针,元素 2 的节点包含指向元素 1 节点的前向指针和指向元素 3 节点的后向指针,以此类推。
      • 访问方式
        • 不能像vectorarray那样直接通过索引来访问元素。要访问list中的元素,通常需要从链表的头部或者某个已知位置开始,逐个节点地遍历。例如,要找到l中的第三个元素,可能需要从l.begin()开始,使用迭代器++操作符移动两次才能找到。这种访问方式的时间复杂度是,其中n是要访问的元素位置与起始位置的距离。
      • 迭代器支持
        • list的迭代器是双向迭代器,不支持像随机访问迭代器那样的算术运算。只能通过++--操作符来向前或者向后移动迭代器。例如,给定一个list<int>的迭代器it,不能使用it + 3这样的操作来移动迭代器,而只能通过it++; it++; it++;这样的方式来移动 3 个位置。
    • forward_list(单向链表)
      • 存储结构
        • forward_list是单向链表,每个节点只包含一个指向下一个节点的指针。例如,对于forward_list<int> fl = {1,2,3,4,5};,元素 1 的节点包含指向元素 2 节点的指针,元素 2 的节点包含指向元素 3 节点的指针,以此类推。
      • 访问方式
        • list类似,不能通过索引直接访问元素,需要从链表头部开始逐个节点地遍历。由于是单向链表,只能向前遍历。访问特定元素的时间复杂度也是,其中n是要访问的元素位置与起始位置的距离。
      • 迭代器支持
        • forward_list的迭代器是前向迭代器,只能使用++操作符向前移动迭代器。不能进行--操作,也不支持算术运算。例如,要遍历forward_list,只能通过for (auto it = fl.begin(); it!= fl.end(); ++it)这样的方式来进行。
    • mapset及其关联容器(基于树结构)
      • 存储结构
        • map为例,通常是基于红黑树实现的。map中的元素是以键值对的形式存储的,键是唯一的,并且按照一定的顺序(默认是升序)排列在树中。例如,对于map<int, int> m = {{1,10},{2,20},{3,30}};,这些键值对在红黑树中按照键的大小进行排序。
      • 访问方式
        • 不能通过索引进行随机访问。一般通过键来查找元素,时间复杂度是,其中n是容器中的元素数量。例如,要查找m中键为 2 的元素,可以使用m.find(2),它会在红黑树中进行对数时间复杂度的查找。
      • 迭代器支持
        • 迭代器是双向迭代器(对于mapset),可以使用++--操作符来遍历容器中的元素。但是不支持算术运算,因为元素在树中的存储位置不是像数组那样连续的,不能通过简单的偏移量来计算元素位置。例如,在遍历map时,迭代器会按照键的顺序依次访问元素。

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

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

相关文章

15.6 JDBC数据库编程6——可滚动和可更新的ResultSet

目录 15.6 引言 15.6.1 可滚动的ResultSet 15.6.1 可更新的ResultSet 15.6 引言 可滚动的ResultSet是指在结果集对象上不但可以向前访问结果集中的记录&#xff0c;还可以向后访问结果集中记录。可更新的ResultSet是指不但可以访问结果集中的记录&#xff0c;还可以更新…

【深度学习代码调试5】标准化数据集:TensorFlow Datasets (TFDS)自动化数据加载与预处理

【标准化数据集】TensorFlow Datasets、TFDS&#xff1a;自动化数据加载与预处理 写在最前面1. 什么是 TensorFlow Datasets (TFDS)?主要特点&#xff1a; 2. TFDS 的核心 API&#xff1a;tfds.builder 和 download_and_preparetfds.builder&#xff1a;创建数据集构建器示例&…

【大数据学习 | Zookeeper】Zookeeper的选举机制

zookeeper的选举机制分为第一次启动和非第一次启动两种情况。 1. 选举机制 - > 第一次启动 (1)服务器1启动&#xff0c;发起一次选举。服务器1投自己一票。此时服务器1票数一票&#xff0c;不够半数以上(3票)&#xff0c;选举无法完成&#xff0c;服务器1状态保持为 LOOKIN…

STM32之EC800K 4G模块驱动

1.EC800K简介 EC800K&#xff0c;特别是EC800K-CN&#xff0c;是移远通信专为M2M&#xff08;机器对机器&#xff09;和IoT&#xff08;物联网&#xff09;领域而设计的超小尺寸LTE Cat 1无线通信模块。EC800K-CN作为一款专为M2M和IoT领域设计的LTE Cat 1无线通信模块&#xff…

w~视觉~合集8

我自己的原文哦~ https://blog.51cto.com/whaosoft/12320868 #xx1 基于mxnet的训练代码迁移到pytorch上和 在yolov5的代码基础上验证了一些目标检测的想法一起发了 在迁移mxnet训练代码的时候&#xff0c;很长一段时间结果都无法对齐&#xff0c;于是我不得不又重新认真的读…

Flutter Column组件实战案例

In this section, we’ll explore the Column widget, a fundamental tool for arranging widgets vertically in Flutter. We’ll dive into its functionality and guide you through using it effectively to create well-organized and visually appealing layouts. 在本节…

UE5 第一人称示例代码阅读0 UEnhancedInputComponent

UEnhancedInputComponent使用流程 我的总结示例分析firstthenand thenfinally&代码关于键盘输入XYZ 我的总结 这个东西是一个对输入进行控制的系统&#xff0c;看了一下第一人称例子里&#xff0c;算是看明白了&#xff0c;但是感觉这东西使用起来有点绕&#xff0c;特此梳…

语言模型微调:提升语言Agent性能的新方向

人工智能咨询培训老师叶梓 转载标明出处 大多数语言Agent依赖于少量样本提示技术&#xff08;few-shot prompting&#xff09;和现成的语言模型。这些模型在作为Agent使用时&#xff0c;如生成动作或自我评估&#xff0c;通常表现不佳&#xff0c;且鲁棒性差。 论文《FIREACT…

随机抽取学号

idea 配置 抽学号 浏览器 提交一个100 以内的整数。&#xff0c;后端接受后&#xff0c;根据提供的整数&#xff0c;产生 100 以内的 随机数&#xff0c;返回给浏览器&#xff1f; 前端&#xff1a;提供 随机数范围 &#xff0c;病发送请求后端&#xff1a;处理随机数的产生&…

【电机应用】变频器控制——变频水泵、变频空调

【电机应用】变频器控制——变频水泵、变频空调 文章目录 [TOC](文章目录) 前言一、变频器1、变频器的组成2、变频器的工作原理3、变频器常用算法 二、变频器的应用场景1、变频水泵2、变频空调 三、参考文献总结 前言 使用工具&#xff1a; 提示&#xff1a;以下是本篇文章正文…

Android 原生开发与Harmony原生开发浅析

Android系统 基于Linux ,架构如下 底层 (Linux )> Native ( C层) > FrameWork层 (SystemService) > 系统应用 (闹钟/日历等) 从Android发版1.0开始到现在15,经历了大大小小的变革 从Android6.0以下是个分水岭,6.0之前权限都是直接卸载Manifest中配置 6.0开始 则分普…

Matlab|基于氢储能的热电联供型微电网优化调度方法

目录 1 主要内容 模型求解流程 2 部分程序 3 程序结果 日前调度 日内调度 4 下载链接 1 主要内容 该程序复现《基于氢储能的热电联供型微电网优化调度方法》&#xff0c;针对质子交换膜燃料电池和电解槽的热电联供特性&#xff0c;为避免氢能系统的热能浪费并进一步提高…

k8s 综合项目笔记

综述 这篇笔记主要是为了记录下自己写 k8s 综合项目的过程。 由于自己之前已经写过简单的开发和运维项目&#xff0c;所以这里就结合一下&#xff0c;在搭建 k8s 集群后安装运维常用服务&#xff0c;比如 ansible 和 prometheus&#xff0c;用 NFS 实现数据存储同步&#xff0c…

Windwos下Docker下载安装centos7.6

操作步骤&#xff1a; 1.打开docker软件进入到DockerHub页面搜索contos镜像 2.在终端通过命令获取镜像并创建容器运行 docker run -itd --name test_centos7.6 centos:7.6.1810 test_centos7.6表示容器的名称 centos:7.6.1810表示镜像的名称&#xff0c;如果镜像不存在会默认拉…

网络层知识点总结4

目录 前言 一、什么是NAT&#xff1f;什么是NAPT&#xff1f;NAT的优点和缺点有哪些&#xff1f;NAPT有哪些特点&#xff1f; 二、建议IPv6协议没有首部检验和。这样做的优缺点是什么&#xff1f; 三、当使用IPv6时&#xff0c;协议ARP是否需要改变&#xff1f;如果需要改变…

ArcGIS计算多个面要素范围内栅格数据各数值的面积

本文介绍在ArcMap软件中&#xff0c;基于面积制表工具&#xff08;也就是Tabulate Area工具&#xff09;&#xff0c;基于1个面要素数据集与1个栅格数据&#xff0c;计算每一个面要素中各栅格数据分布面积的方法。 首先&#xff0c;来看一下本文的需求。现有一个矢量面的要素集…

Springboot整合原生ES依赖

前言 Springboot整合依赖大概有三种方式&#xff1a; es原生依赖&#xff1a;elasticsearch-rest-high-level-clientSpring Data ElasticsearchEasy-es 三者的区别 1. Elasticsearch Rest High Level Client 简介: 这是官方提供的 Elasticsearch 客户端&#xff0c;支持…

小问题解决方法汇总(2024.10.24水个勋章)

问题1&#xff1a;”因为在系统上禁止运行脚本“ 我们在使用命令行时经常遇到类似文章这样的提示&#xff0c;或者是如下截图中显示的那样&#xff1a; 仅需要在“管理员权限下的Powershell”中输入下面的命令即可解决&#xff1a; set-ExecutionPolicy RemoteSigned 输入命…

【数据分享】全国科技-产品质量国家监督抽查(1995-2021年)

数据介绍 一级标题指标名称单位科技国家监督抽查产品种类种科技国家监督抽查食品种类种科技国家监督抽查日用消费品种类种科技国家监督抽查建筑与装饰装修材料种类种科技国家监督抽查农业生产资料种类种科技国家监督抽查工业生产资料种类种科技国家监督抽查企业家科技国家监督抽…

软工毕设开题建议

文章目录 &#x1f6a9; 1 前言1.1 选题注意事项1.1.1 难度怎么把控&#xff1f;1.1.2 题目名称怎么取&#xff1f; 1.2 开题选题推荐1.2.1 起因1.2.2 核心- 如何避坑(重中之重)1.2.3 怎么办呢&#xff1f; &#x1f6a9;2 选题概览&#x1f6a9; 3 项目概览题目1 : 深度学习社…