STL之初始迭代器

news2024/11/15 15:50:45

 迭代器

什么是迭代器?

- 迭代器是一种检查容器内元素并且遍历容器内元素的数据类型

迭代器的作用:

- 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围

为什么需要迭代器?
- STL提供每种容器的实现原理各不相同,如果没有迭代器我们需要记住每一种容器中对象的访问方法,很显然这样会变得非常麻烦
- 每个容器中都实现了一个迭代器用于对容器中对象的访问,虽然每个容器中的迭代器的实现方式不一样,但是对于用户来说操作方法是一致的,也就说通过迭代器统一了对所有容器的访问方式。例如:无论哪个容器,访问当前元素的下一个元素我们可以通过迭代器自增进行访问

vector容器的iterator类型

vector<int>::iterator iter; //变量名为iter

vector容器的选代器属于"随机访问选代器",迭代器一次可以移动多个位置

成员函数功能
begin()返回指向容器中第一个元素的正向迭代器;如果是const 类型容器,在该的数返回的是常量正向迭代器
end()返回指向容器最后一个元素之后一个位置的正向法代器;如果是 const 类型容器,在该函教返回的是常量正向迭代器。此的数通常和 begin()搭配使用
rbegin()返回指向最后一个元素的反向选代器;如果是const 类型容器,在该函数返回的是常量反向选代器
rend()返回指向第一个元素之前一个位置的反向迭代器。如果是 const 类型容器,在该的数返回的是常量反向迭代器。此的数通常和 rbegin()搭配使用
cbegin()和 begin()功能类似,只不过其返回的选代器类型为常量正向选代器,不能用于修改元素
cend()和 end()功能相同,只不过其返回的选代器类型为常量正向迭代器,不能用于修改元素
crbegin()和 rbegin()功能相同,只不过其返回的选代器类型为常量反向选代器,不能用于修改元素
crend()和 rend()功能相同,只不过其返回的选代器类型为常量反向选代器,不能用于修改元素

示例:

#include<iostream>
#include<vector>
using namespace std;
int main() {
	vector<int> vectA;
	int Array[] = { 100,1,20,30,40 };
	vector<int>::iterator iter;
	vectA.assign(Array, Array + 5);
	for(iter=vectA.begin();iter<vectA.end();iter++){
		cout << *iter << " ";
	}
	cout << endl;
}

迭代器失效

由于迭代器本身并不是一个普通的指针,直接输出迭代器的地址可能不会得到你想要的结果。

迭代器失效的本质确实是地址的改变,但这只是一个方面。迭代器失效的原因不仅限于地址的改变,还涉及到容器内部数据结构的变化。具体来说,迭代器失效可以由以下几种情况引起:

  1. 地址的改变

    • 当删除一个元素时,如果该元素不是容器的最后一个元素,容器会将后面的元素向前移动以填补空位。这会导致这些元素的地址发生变化,从而使指向这些元素的迭代器失效。
  2. 容器内部数据结构的变化

    • 容器内部可能有多种数据结构,如动态数组、链表等。在某些情况下,删除或插入操作可能会导致容器重新组织其内部数据结构,从而导致迭代器失效。

插入元素

示例:如下面代码所示,在对vector容器使用insert()函数时,会将原来存储数据的空间释放掉,重新开辟新的空间进行赋值,所以当运行到 cout << *it << endl; 这行代码时,会出现报错,因为没有权限去访问原先vector数据所对应的空间

#include<iostream>
#include<vector>
using namespace std;
int main() {
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	vector<int>::iterator it = v.begin() + 3;
	v.insert(it, 8);
	cout << *it << endl;
}

正确示例:

insert()是可以返回新开辟空间所插入相应位置的地址的

using namespace std;
int main() {
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	vector<int>::iterator it = v.begin() + 3;
	it = v.insert(it, 8);
	cout << *it << endl;
	cout << &(*(v.begin())) << endl;
}

删除元素

示例:

如下面所示,当我们进行数据的删除时,若是对容器中最后一个数据进行删除则不会有影响,带如果删除的数据不在末尾,则会造成容器内部数据结构的改变,从而导致迭代器失效,因此最保守的方式就是每次在进行删除操作后都更新迭代器(虽然erase不会重新分配地址

#include<iostream>
#include<vector>
using namespace std;
int main() {
	vector<int> cond = { 1,2,3,3,3,3,4,5,6 };
	vector<int>::iterator it;
	for (it = cond.begin(); it != cond.end();) {
		if (*it == 3) {
			cout << "before del" << &(*it) << endl;
			it = cond.erase(it);
			cout << "after del" << &(*it) << endl;
		}
		else { it++; }
	}
	for (it = cond.begin(); it != cond.end(); it++) {
		cout << *it << ' ';
	}
}

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

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

相关文章

心觉:《潜意识显化实操营》首批体验者招募

你是否常常感到困惑&#xff0c;对未来感到迷茫&#xff1f; 你是否在事业、生活中遇到瓶颈&#xff0c;迫切希望突破&#xff1f; 你是否想要把自己3万倍的潜意识能量释放出来 &#xff0c;助力成功&#xff1f; 你是否想要解锁你财富显化的卡点&#xff0c;顺便实现财富自…

CISSP一站通关

依托轻速云维护了一个专注于CISSP备考通关的在线学习平台&#xff0c;提供知识串讲视频&#xff0c;配合大量针对性的习题和重难点习题解析&#xff0c;帮助备考学习者高效学习和巩固知识点。已经帮助100考友顺利通过考试。 知识串讲视频是我主讲的5天直播课程的录屏&#xff0…

C# 反射之动态生成dll/exe

这个可能应该属于反射的高级使用范围了&#xff0c;平常在项目中使用的人估计也不是很多。由于使用反射的话会降低性能&#xff0c;比如之前用到的GetValue、SetValue等之类&#xff0c;但是使用这种方式会大大提高效率&#xff0c;在这里我只想说&#xff0c;都直接写IL指令了…

Qt学习之旅 I

构建一个跨平台的应用(Create A Cross-Platform Application) 目录 构建一个跨平台的应用(Create A Cross-Platform Application) 设计模式 开始构建 Qt是跨平台的C框架&#xff0c;这里&#xff0c;我们将会构建一个简单的C跨平台项目来熟悉QT是如何实现简单的跨平台的。 …

HTB-MarkUp(XXE漏洞、SSH id_rsa密钥)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解MarkUp靶机 渗透过程 信息搜集 服务器开放了22SSH端口、80HTTP端口 和 443HTTPS端口 弱口令登录后台 抓取http 数据包&#xff0c;进行加载 账号密码字典 账号: admin密码: password 利用XXE漏洞 捕…

超分辨率技术之插值算法

&#x1f31e;欢迎莅临我的个人主页&#x1f448;&#x1f3fb;这里是我专注于深度学习领域、用心分享知识精粹与智慧火花的独特角落&#xff01;&#x1f349; &#x1f308;如果大家喜欢文章&#xff0c;欢迎&#xff1a;关注&#x1f377;点赞&#x1f44d;&#x1f3fb;评论…

天融信把桌面explorer.exe删了,导致开机之后无windows桌面,只能看到鼠标解决方法

win10开机进入桌面&#xff0c;发现桌面无了&#xff0c;但是可以ctrlaltdelete调出任务管理器 用管理员权限打开cmd&#xff0c;输入&#xff1a; sfc /scanfilec:\windowslexplorer.exe 在运行C:\windows\Explorer.exe&#xff1b;可以进入桌面&#xff0c;但是隔离几秒钟…

链式二叉树的基本操作(C语言版)

目录 1.二叉树的定义 2.创建二叉树 3.递归遍历二叉树 1&#xff09;前序遍历 2&#xff09;中序遍历 3&#xff09;后序遍历 4.层序遍历 5.计算节点个数 6.计算叶子节点个数 7.计算第K层节点个数 8.计算树的最大深度 9.查找值为x的节点 10.二叉树的销毁 从二叉树…

物体识别之微特征识别任务综述

“深度人工智能”是成都深度智谷科技旗下的人工智能教育机构订阅号&#xff0c;主要分享人工智能的基础知识、技术发展、学习经验等。此外&#xff0c;订阅号还为大家提供了人工智能的培训学习服务和人工智能证书的报考服务&#xff0c;欢迎大家前来咨询&#xff0c;实现自己的…

一模--解题--71-80

文章目录 9.资源管理71、 [单选] 一个项目连续错过交付日期&#xff0c;项目团队评估完该情况后&#xff0c;项目经理意识到团队绩效差的原因在于团队成员对于自己的职责缺乏清晰认识。项目经理首先应该关注哪一项&#xff1f; 13.干系人管理72、 [单选] 项目团队刚刚完成一个新…

element-plus的面包屑组件el-breadcrumb

面包屑组件主要用来显示当页面路径&#xff0c;以及快速返回之前的页面。 涉及2个组件 el-breadcrumb 和el-breadcrumb-item, el-breadcrumb的spearator指定item的分隔符 el-breadcrumb-item的to和replace属性和vue-router的一致&#xff0c;需要结合vue_router一起使用 用法…

WSL安装Redis

前言 本来一直是在虚拟机的Ubuntu开发 但是 搞着搞着内存不足 导致我某些数据损坏了 然后目前迁移到Wsl开发 运行WSL的相较于虚拟机你不需要很多的性能开销&#xff01; 我只是代码开发和git交互&#xff0c;如果是搞逆向还是虚拟机。 记录一下redis 安装卸载 免得以后又忘了…

【中等】机试-滑动窗口(双指针)-例:无重复字符的最长子串

※高频、重点 字节&#xff08;飞书&#xff09;、百度等大厂测开高频面试题&#xff1a;最长不重复子串 . - 力扣&#xff08;LeetCode&#xff09;字节飞书面经里的高频题&#xff0c;没做出来&#xff0c;需要好好复习。 重点考察-滑动窗口这个概念&#xff0c;自学记录一…

攻击者如何在日常网络资源中隐藏恶意软件

近二十年来&#xff0c;安全 Web 网关 (SWG) 一直在监控网络流量&#xff0c;以检测恶意软件、阻止恶意网站并保护企业免受基于 Web 的威胁。 然而&#xff0c;攻击者已经找到了许多绕过这些防御措施的方法&#xff0c;SquareX的安全研究人员对此进行了记录。 最危险的策略之…

【Linux】调试和Git及进度条实现

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;Linux入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1.…

LinkedHashMap 如何实现排序

目录 一、LinkedHashMap二、排序实现三、代码片段分析 一、LinkedHashMap LinkedHashMap 是 Java 中的一个集合类&#xff0c;它是 HashMap 的一个子类&#xff0c;继承了 HashMap 的所有特性&#xff0c;并且在此基础上增加了一个双向链表来维护元素的插入顺序或者访问顺序。L…

java的内存分配和回收机制

Java 与 C之间有一堵由内存动态分配和垃圾收集技术所围成的高墙&#xff0c;墙外面的人想进去&#xff0c;墙里面的人却想出来。 概述 垃圾收集&#xff08;GC&#xff09;需要完成的三件事情&#xff1a; 哪些内存需要回收&#xff1f;什么时候回收&#xff1f;如何回收&am…

CloudXR 套件扩展 XR 工作流

NVIDIA为开发者提供了一个先进的平台&#xff0c;开发者可以在该平台上使用全新NVIDIA CloudXR 套件来创建可扩展、品牌化的定制扩展现实&#xff08;XR&#xff09;产品。 NVIDIA CloudXR 套件基于全新架构而打造&#xff0c;是扩展XR生态的重要工具。它为开发者、专业人士和…

高级 API 性能:着色器

着色器通过使您能够控制渲染过程的各个方面&#xff0c;在图形编程中发挥着关键作用。它们在 GPU 上运行&#xff0c;负责操作顶点、像素和其他数据。 常规着色器计算着色器像素渲染顶点着色器几何体、域和外壳着色器 常规着色器 这些提示适用于所有类型的着色器。 推荐 避…

[产品管理-10]:NPDP新产品开发 - 8 - 波士顿矩阵(当下与未来)在产品市场战略方面的应用

目录 一、波士顿矩阵 理论基础 产品类型划分 分析步骤 重要性 注意事项 二、波士顿矩阵的应用实例 示例背景 数据收集与准备 绘制波士顿矩阵 产品线分类 制定战略对策 一、波士顿矩阵&#xff1a;现在 VS 未来 波士顿矩阵理论&#xff0c;又称市场增长率-相对市场份…