C++ STL概念之 迭代器

什么是迭代器

迭代器(Iterator)是一个在容器中访问元素的对象,提供了一种方法来顺序访问容器中的元素,而无需暴露容器的底层表示。

或者说 行为像指针一样的类型。可能是指针也可能是被类封装的指针,不关注容器底层细节访问容器。

迭代器在STL的地位

迭代器的价值是什么

是STL其他五个组件的粘合剂

迭代器使得编写一些通用算法成为可能,这些算法可以作用于不同类型的容器而无需改变代码。

什么是迭代器失效

迭代器失效,顾名思义,就是迭代器无效的情况。如果一个迭代器无法正确引用一个元素(比如元素已经被删除)或者迭代器的行为无法预知(如在迭代的过程中容器发生改变),我们就说这个迭代器已经失效。

迭代器失效的情况和主要原因:

  1. 容器元素被删除。如果一个元素被删除,指向该元素的迭代器,引用和指针都会失效。
  2. 非序列容器(如 map, set)的元素被修改。对于非序列容器,元素的值(key)是关键的部分,改变元素的值可能会改变元素在容器中的位置,这会使得指向该元素的迭代器失效。

  3. 容器的内存空间被重新分配。对于某些需要连续内存空间的容器(如 vector, deque, string),如果在容器中添加元素使得容器容量不足而进行重新分配,原来的迭代器就会失效。而对于 list 和 forward_list 这样的链表结构,添加或删除元素只会影响到指向这个元素的迭代器,其他的迭代器不会失效。

=========================================================================

反向迭代器的原理

反向迭代器(Reverse Iterators)是一种特殊的迭代器,它将内部容器的迭代顺序反向,使得原本从前往后的顺序变为从后往前。

原理:

反向迭代器的工作原理是通过对原始迭代器进行包装,改变其 ++--* 等操作的语义。我们可以用 rbegin() 获取一个反向迭代器,这个迭代器指向容器的最后一个元素,然后通过 ++ 运算符可以使其向前移动,而不是向后。

迭代器分类

单向++  (Forward iterators)

forword_list 和unordered_map / unordered_set 都是单向迭代器

双向 ++ / -- (Bidirectional iterators)

map / set 和list 都是双向迭代器

随机迭代器 ++ / -- / + / - (Random-access iterators)

string vector deque 都是随机迭代器

迭代器分类的目的是为了提供不同层次的接口访问容器中的元素,这样设计使得算法可以基于迭代器的类别进行适配,实现更高的灵活性和通用性。例如,一些算法仅需要输入迭代器,而更复杂的算法可能需要随机访问迭代器。按照迭代器的分类实现算法,可以保证算法可以在满足要求的最宽泛范围的容器上工作。

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

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

相关文章

搭建内网穿透服务(frp)

搭建内网穿透服务(frp) 一、为什么 在平时工作当中,我们经常会遇到需要将自己本地的服务暴露在公网上,方便与他人进行接口对接、或者进行演示等等,虽然有一些免费的内网穿透服务,但是大都很不稳定或者带宽太低&#x…

让调用者自己干活的特殊线程池

让调用者自己干活的特殊线程池 1. 相关背景 单元测试时, 我们的某些业务代码可能是在线程池中运行的,可能会出现各种不一致的情况。 这时候可以hack一下, 创建一个调用者直接执行的线程池,避免干扰; 2. 实现代码 import java.util.concurrent.*;// 让…

【永洪BI】资源导出

路径:管理系统>资源部署>资源导出 1.页面介绍 选择左侧面板中的管理系统,点击资源部署,选择资源导出,进入资源导出页面。 【名称】导出的 jar 文件的名称,必填项。 【描述】导出的 jar 文件中包含的描述信息…

Gateway基本配置的参数以及yml示例

Spring Cloud Gateway作为API网关,可以通过配置文件来定义路由规则、过滤器和相关参数。 参入如下: routes: 定义了一组路由规则,每个路由规则包含了路由的ID、目标URI、断言集合和过滤器集合。 id: 路由的唯一标识符,用于区分不同…

华为昇腾310B1平台视频解码失败[ERROR] Send frame to vdec failed, errorno:507018

目录 1 [ERROR] Send frame to vdec failed, errorno:507018 2 bug解决尝试1 3 bug解决尝试2 4 最终解决方法 参考文献: 1 [ERROR] Send frame to vdec failed, errorno:507018 某项目中的代码运行报错 [ERROR] Send frame to vdec failed, errorno:507018 Ac…

Linux系统 -目录结构与配网

目录的特点 Windows中有C盘、D盘等,每个都是一个根系统是个多根系统 Linux中只有一个根是个单根系统 Linux-目录存储的内容 1、/root:管理员的家目录 2、/home:存储普通用户家目录的目录/3、/tmp:临时目录,这个目录存储…

linux系统管理面试题

用户管理: 1. 如何在Linux中创建一个新用户并设置密码? 在Linux中创建一个新用户并设置密码,可以使用以下步骤: 打开终端或命令行界面。使用root权限登录或使用sudo命令获取管理员权限。运行以下命令来创建新用户(将…

了解 Robot Framework :接口自动化测试教程!

开源自动化测试利器:Robot Framework Robot Framework 是一个用于实现自动化测试和机器人流程自动化(RPA)的开放源代码框架。它由一个名为 Robot Framework Foundation 的组织得到推广,得到了多家领军企业在软件开发中的广泛应用。…

运营商三要素核验接口如何对接

运营商三要素核验接口又叫运营商手机号三要素验证接口、运营商手机号实名认证接口、运营商手机号三要素核验接口,指的是输入姓名、身份证号码及手机号,通过运营商数据库实时校验此三项是否匹配。那么运营商三要素核验接口如何对接呢? 首先我…

Java SE入门及基础(51) Queue 接口 比较器接口

目录 Queue 接口 1. 特性描述 Queue 接口常用方法 2. LinkedBlockingQueue 用法示例 3. PriorityQueue 用法示例 思考:如果 PriorityQueue 队列中存储的是对象,会怎么排序? 比较器接口 1. 比较器接口的作用 2. Comparable 接口 示…

【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)

🔍目的 提供一个用于创建相关对象家族的接口,而无需指定其具体类 🔍解释 真实世界例子 要创建一个王国,我们需要具有共同主题的对象。精灵王国需要精灵国王、精灵城堡和精灵军队,而兽人王国需要兽人国王、兽人城堡和兽…

项目路由分模块A模块B模块C......模块N使用

路由分模块原因: vue框架中会有router文件,但是路由文件下只有一个路由文件,在实际项目开发中会有多人负责多模块的情况,若都在一个文件内编辑路由名称,就相当于是机房里的数据线,会很乱七八糟,…

1. go语言初识(一)

本篇博客涉及到的内容:变量和常量、iota常量生成器、类型转换 变量(Variables)和常量(Constants) 变量(Variables) 1. 定义变量 在Go中,可以使用’var‘关键字来声明一个变量&…

【十大排序算法】----选择排序(详细图解分析+实现,小白一看就会)

目录 一:选择排序——原理 二:选择排序——分析 三:选择排序——实现 四:选择排序——优化 五:选择排序——效率 一:选择排序——原理 选择排序的原理:通过遍历数组,选出该数组…

使用Docker配置深度学习环境——以diffusers为例

Docker的其他信息可以在我的网站上找到,这里假设安装完成了,直接上手。 git clone 仓库地址打开docker目录,找到目标版本: sudo docker build diffusers-pytorch-cuda如果失败,尝试使用换源: sudo nano …

GPT-4o 炸裂发布!你竟然还没用上?(附详细教程)

今天AI界的爆炸新闻非chatgpt-4o莫属,从早上到现在随处可见的文章推送,视频推送。 大家或多或少都有耳闻了,今天主要讲一讲我们普通人到底怎么用?如果不氪金行不行?我就想体验一下可不可以?带着问题往下看 …

提升写作效率的秘密武器:一个资深编辑的AI写作体验

有句话说:“写作是一项你坐在打字机前流血的工作。”而如今,各类生成式软件的涌现似乎打破了写作这一古老的艺术形式壁垒。过去,作家们独自在书桌前冥思苦想,如今,一款名为“玲珑AI工具”的ai写作助手正悄然改变着文案写作行业的创作生态,成为提升写作效率的秘密武器。 在传统…

【数据结构】图和基本算法

文章目录 1. 图的基本概念1.1 图本身的定义1.2 相关概念 2. 图的存储结构2.1 邻接矩阵2.2 邻接表 3. 图的遍历3.1 广度优先遍历(BFS)3.2 深度优先遍历(DFS) 4. 最小生成树4.1 Kruskal算法4.2 Prim算法 5. 最短路径5.1 单源最短路径…

【Linux】基础命令:进程、网络

systemctl命令 控制内置服务 systemctl start | stop | status | enable | disable 服务名 start | stop开启关闭,status状态,enable | disable开启关闭开机自启 date命令 查看系统时间 date [-d] [格式化字符串] date -d “1 day” %Y-%m-%d 修改时区…

表达式运算符位运算

表达式 概念: 由常量、变量、运算符、()组成一句代码。代码最终有一个结果。 // 定义: 由常量、变量、运算符、()组成。由一个结果// 规律1: 当表达式中所有的变量类型小于等于int( int shor…