STL中的神秘“指针”:迭代器

在这里插入图片描述

🚀write in front🚀
📜所属专栏:C++学习
🛰️博客主页:睿睿的博客主页
🛰️代码仓库:🎉VS2022_C语言仓库
🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!
关注我,关注我,关注我你们将会看到更多的优质内容!!

在这里插入图片描述

文章目录

  • 前言
  • 什么是迭代器?
  • 迭代器的分类(容器底层结构决定)
    • 迭代器在STL中的应用
  • 自定义迭代器
  • 总结

前言

  今天我们将一起深入探讨C++中的一个重要概念——迭代器(Iterators)。在C++标准库中,迭代器是一种用于遍历容器元素的工具,它为我们提供了一种统一的访问容器内元素的方式,不论容器的类型如何。在本篇博客中,我们将从头开始学习迭代器的原理、分类以及它在STL中的实际应用。

什么是迭代器?

  迭代器是一种抽象的数据类型,类似于指针。它允许我们遍历并访问容器(如向量、列表、映射等)中的元素,而无需了解容器内部的结构细节。迭代器的行为类似于指针,允许我们使用类似指针的语法(如解引用、自增等)来操作容器中的元素。

迭代器的分类(容器底层结构决定)

在C++中,迭代器被分为五个类别,每个类别具有不同的功能和限制。这五种迭代器分别为:

  1. 输入迭代器(Input Iterators):
    功能:只能读取容器中的元素,且只能使用一次。类似于只读的指针。
    特点:支持解引用(*)、自增(++)、相等性比较(==)和不等性比较(!=)等操作。
    示例:常用于单向遍历容器元素,例如用于查找、遍历等操作。

  2. 输出迭代器(Output Iterators):
    功能:只能向容器中写入元素,也只能使用一次。类似于只写的指针。
    特点:支持解引用(*)、自增(++)等操作。
    示例:较少使用,用于特殊场景的数据写入。

  3. 前向迭代器(Forward Iterators):
    功能:可以读取和写入容器中的元素,且能够多次遍历容器。
    特点:支持解引用(*)、自增(++)、相等性比较(==)和不等性比较(!=)等操作。
    示例:常用于单向遍历,可以遍历某个容器的所有元素。

  4. 双向迭代器(Bidirectional Iterators):
    功能:功能与前向迭代器类似,但支持自增(++)和自减(–)操作。
    特点:支持解引用(*)、自增(++)、自减(–)、相等性比较(==)和不等性比较(!=)等操作。
    示例:常用于双向遍历,可以在容器中前进和后退。

  5. 随机访问迭代器(Random Access Iterators):
    功能:功能最强大,支持所有迭代器操作,类似于指针的完整功能。
    特点:支持解引用(*)、自增(++)、自减(–)、相等性比较(==)和不等性比较(!=)等操作,还支持算术运算(+、-、+=、-=)、下标访问([])等。
    示例:具有最灵活的遍历能力,可以快速访问容器中的任意元素。

在这里插入图片描述
  我们可以在不同的容器下看到他们的迭代器类型:

list:双向
在这里插入图片描述
vector:随机
在这里插入图片描述
set:双向:
在这里插入图片描述
forward_list:单向:

在这里插入图片描述  在后面继承我们会学到,子类可以通过父类指针指向。上面介绍是是从父类开始介绍的,往下的都是继承上面的。所以我们再看算法库的时候要看清楚哪些能用,哪些不能用,我们以sort为例子:
在这里插入图片描述
  这里的迭代器是随机迭代器,所以我们的vector可以使用,但是list是他的父类,不能指向,所以list不能使用该算法(算法库用的快排,而链表无法快排)

迭代器在STL中的应用

  标准模板库(STL)是C++标准库中一个强大且高度模块化的部分。它提供了许多常用的数据结构和算法,其中的迭代器起到了至关重要的作用,他们是串通算法和容器的神奇指针。
在这里插入图片描述

STL中的容器(如vector、list、map等)都提供了自己的迭代器,让我们可以轻松遍历和操作其中的元素。

让我们以vector为例,看看如何使用迭代器遍历其中的元素:

#include <iostream>
#include <vector>int main() {std::vector<int> myVector = {1, 2, 3, 4, 5};// 使用迭代器遍历容器vector<int>it1 = lt.begin();while (it1 != lt.end()){cout << *it1 << " ";it1++;}cout << endl;auto it2 = lt.begin();while(it2!=lt.end()){cout << *it2 << " ";it2++;}cout << endl;return 0;
}

当然,我们在访问list等其他容器的时候也是这样的。

自定义迭代器

  除了使用STL提供的迭代器,我们还可以自定义迭代器,让我们的自定义数据结构也能够像容器一样使用范围-for循环等STL算法。自定义迭代器需要实现一系列的操作符重载,如*、++、–等,以及符合迭代器的五种类别要求。

总结

  迭代器是C++标准库中一种非常重要的抽象概念,它为我们提供了一种统一的访问容器元素的方式,让我们无需了解容器内部的细节。通过使用迭代器,我们能够更加灵活地处理数据结构,从而更加高效地开发C++程序。希望通过本篇博客,读者们能够对C++迭代器有更深入的了解,并能在实际项目中灵活运用它们。

  更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~ 你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

专栏订阅:
每日一题
C语言学习
算法
智力题
初阶数据结构
Linux学习
C++学习
更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~ 你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

在这里插入图片描述

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

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

相关文章

NAT协议(网络地址转换协议)详解

NAT协议&#xff08;网络地址转换协议&#xff09;详解 为什么需要NATNAT的实现方式静态NAT动态NATNAPT NAT技术的优缺点优点缺点 NAT协议是将IP数据报头中的IP地址转换为另外一个IP地址的过程&#xff0c;主要用于实现私有网络访问公有网络的功能。这种通过使用少量的IP地址代…

2023-7-26-第二十三式解释器模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

[vue] 新项目配置整理(没写完,回头有空继续)

省流版(vue2项目)&#xff1a; 脚手架&#xff1a;vue create xxxx vuex&#xff1a;npm i vuex3 router : npm install vue-router3 vue cli创建项目 vue create xxxx(项目名称) 添加基本配置 module.exports {lintOnSave: false, // 关闭eslint检查publicPath:./, //…

Longhorn vs Rook vs OpenEBS vs Portworx vs IOMesh:细说 5 款 K8s 持久化存储产品优劣势

云原生时代下&#xff0c;越来越多的企业开始使用 Kubernetes&#xff08;K8s&#xff09;承载数据库、消息中间件等“生产级”有状态工作负载。由于这些应用对数据持久保存、性能、容量扩展和快速交付具有较高的要求&#xff0c;企业往往需要采用专为 Kubernetes 环境设计的持…

ViT-vision transformer

ViT-vision transformer 介绍 Transformer最早是在NLP领域提出的&#xff0c;受此启发&#xff0c;Google将其用于图像&#xff0c;并对分类流程作尽量少的修改。 起源&#xff1a;从机器翻译的角度来看&#xff0c;一个句子想要翻译好&#xff0c;必须考虑上下文的信息&…

使用easyui的tree组件实现给角色快捷分配权限功能

这篇文章主要介绍怎么实现角色权限的快捷分配功能&#xff0c;不需要像大多数项目的授权一样&#xff0c;使用类似穿梭框的组件来授权。 具体实现&#xff1a;通过菜单树的勾选和取消勾选来给角色分配权限&#xff0c;在这之前&#xff0c;需要得到角色的菜单树&#xff0c;角色…

【Lua学习笔记】Lua进阶——Table,迭代器

文章目录 官方唯一指定数据结构--tabletable的一万种用法字典和数组 迭代器ipairs()pairs() 回到Table 在【Lua学习笔记】Lua入门中我们讲到了Lua的一些入门知识点&#xff0c;本文将补充Lua的一些进阶知识 官方唯一指定数据结构–table 在上篇文章的最后&#xff0c;我们指出…

Mybatis使用collection映射一对多查询分页问题

场景&#xff1a;页面展示列表&#xff0c;需要查询多的字段&#xff0c;和一的字段。并且还要分页。 这时候直接想到的是手写sql。 /*** 标签*/private List<BasicResidentTags> tags;Data TableName("basic_resident_tags") public class BasicResidentTag…

C#如何使用SQLite数据库?

文章目录 0.引言1.SQLite工具准备2.创建窗体项目并添加SQLite的命名空间3.编写使用SQLite代码4.结果展示 0.引言 SQLite是一个轻量级的嵌入式数据库&#xff0c;它的库文件非常小巧&#xff0c;不需要独立的服务器进程或配置。这使得它非常适合在资源受限的环境中使用&#xff…

【Terraform学习】Terraform-AWS部署快速入门(快速入门)

Terraform-AWS部署快速入门 实验步骤 连接到 Terraform 环境 SSH 连接到Terraform 环境(名为MyEC2Instance的实例) 在 Amazon Web Services &#xff08;AWS&#xff09; 上预置 EC2 实例 用于描述 Terraform 中基础结构的文件集称为 Terraform 配置。您将编写一个配置来定义…

防御第三天

1.总结当堂NAT与双机热备原理&#xff0c;形成思维导图 2.完成课堂NAT与双机热备实验 fw1: <USG6000V1>sy [USG6000V1]int g0/0/0 [USG6000V1-GigabitEthernet0/0/0]ip add 192.168.18.2 24 [USG6000V1-GigabitEthernet0/0/0]service-manage all permit (地址无所谓&…

leetcode 50. Pow(x, n)(x的n次方)

求x的n次方。 思路&#xff1a; 第一个想到的思路是x和它自己乘n次&#xff0c; 但是这样做会面临一些问题&#xff1a; 如果是简单的n很小的情况还好&#xff0c;但是可以看到n的取值横跨整个整数范围&#xff0c; 如果n非常大&#xff0c;一次一次乘x效率低是其一。 一般来…

探索网页原型设计:构建出色的用户体验

在当今数字化时代&#xff0c;用户对网页体验的要求日益提高。在网页设计过程中&#xff0c;扮演着至关重要的角色。通过网页原型设计&#xff0c;产品经理能够更好地展示和传达网页的整体布局、导航结构、元素位置和交互效果&#xff0c;从而使团队成员更清晰地了解设计意图&a…

mapboxGL中楼层与室内地图的结合展示

概述 质量不够&#xff0c;数量来凑&#xff0c;没错&#xff0c;本文就是来凑数的。前面的几篇文章实现了楼栋与楼层单体化的展示、室内地图的展示&#xff0c;本文结合前面的几篇文章&#xff0c;做一个综合的展示效果。 实现效果 实现 1. 数据处理 要实现上图所示的效果…

Excel透视表与python实现

目录 一、Excel透视表 1、源数据 2、数据总分析 3、数据top分析 二、python实现 1、第一张表演示 2、第二张表演示 一、Excel透视表 1、源数据 1&#xff09;四个类目&#xff0c;每类50条数据 2&#xff09;数据内容 2、数据总分析 1&#xff09;选择要分析的字段&…

vue项目登录页面实现记住用户名和密码

vue项目登录页面实现记住用户名和密码 记录一下实现的逻辑&#xff0c;应该分两步来理解这个逻辑 首次登录&#xff0c;页面没有用户的登录信息&#xff0c;实现逻辑如下&#xff1a; 用户输入用户名和密码登录&#xff0c;用户信息为名为form的响应式对象&#xff0c;v-model…

Linux Day03

一、基础命令(在Linux Day02基础上补充) 1.10 find find 搜索路径 -name 文件名 按文件名字搜索 find 搜索路径 -cmin -n 搜索过去n分钟内修改的文件 find 搜索路径 -ctime -n搜索过去n分钟内修改的文件 1&#xff09;按文件名字 2&#xff09;按时间 1.11 grep 在文件中过…

linux+Jenkins+飞书机器人发送通知(带签名)

文章目录 如何使用在linux 上安装python 环境发送消息python脚本把脚本上传倒linux上 jenkins 上执行脚本 如何使用 自定义机器人使用指南飞书官网https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot 在linux 上安装python 环境 yum install python3 python…

如何在3ds max中创建可用于真人场景的巨型机器人:第 5 部分

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. After Effects 中的项目设置 步骤 1 打开“后效”。 打开后效果 步骤 2 我有真人版 我在After Effects中导入的素材。这是将 用作与机器人动画合成的背景素材。 实景镜头 步骤 3 有背景 选定的素材…

Mindar.JS——实现AR图像追踪插入图片或视频

Mindar.JS使用方式 注意&#xff1a;此篇文章需要启动https才可调用相机权限 图像追踪示例 需要用到两个js库 <script src"./js/aframe.min.js"></script><script src"./js/mindar-image-aframe.prod.js"></script>下面看一下标签…