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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kaggle新赛:Bengali.AI 语音识别大赛赛题解析

赛题名称&#xff1a;Bengali.AI Speech Recognition 赛题链接&#xff1a;https://www.kaggle.com/competitions/bengaliai-speech 赛题背景 竞赛主办方 Bengali.AI 致力于加速孟加拉语&#xff08;当地称为孟加拉语&#xff09;的语言技术研究。Bengali.AI 通过社区驱动的…

uni-app如何生成正式的APK

第一步&#xff1a; 进入dcloud官网https://dcloud.io/&#xff0c;点击开发者后台进入登录注册页面 第二步&#xff1a;登录之后跳到项目列表&#xff0c;选择自己想要打包的项目 点击进去如果没有生成证书&#xff0c;点击生成证书&#xff0c;如果显示证书已生成就不用管了…

【Windows】WDS中如何跳过语言选择以及身份验证

WDS&#xff08;Windows Deployment Services&#xff09;是微软的一项网络服务&#xff0c;用于快速和方便地部署Windows操作系统到多台计算机上。它提供了一种自动化的方式来安装、配置和管理操作系统映像&#xff0c;使企业能够快速部署和更新大量的计算机系统。网上有很多W…

【Kaggle】Kaggle数据集如何使用命令语句下载?

一、Kaggle数据集如何下载 1.1 问题的起因 最近看到了 Google 组织的 Kaggle 比赛&#xff0c;想自己试一下&#xff0c;但是数据集太大了&#xff0c;将近有370G的数据。直接下载的话&#xff0c;网速太慢&#xff0c;可能要下载3-4天&#xff0c;所以萌生了用命令语句下载的…

详解rocketMq通信模块升级构想

本文从开发者的角度深入解析了基于netty的通信模块, 并通过简易扩展实现微服务化通信工具雏形, 适合于想要了解netty通信框架的使用案例, 想了解中间件通信模块设计, 以及微服务通信底层架构的同学。希望此文能给大家带来通信模块架构灵感。 概述 网络通信是很常见的需求&#…

并发编程可能出现的核心问题

2.1非可见性 如果主内存里有个静态变量flagfalse&#xff0c;然后线程A和B在工作内存都需要操作flag&#xff0c;线程A是while(!false){}&#xff0c;而线程B将flag改为true&#xff0c;但是由于线程A和线程B之间工作内存互相不可见&#xff0c;线程A就会陷入死循环。 2.2指令…

【C++11】——类的新功能

目录 1. 默认成员函数 2. 类成员变量初始化 3. 强制生成默认函数的关键字default 4. 禁止生成默认函数的关键字delect 5. 继承和多态的final与override关键字 6. 测试案例 1. 默认成员函数 原来C类中&#xff08;C11之前&#xff09;&#xff0c;有6个默认成员函数&…

GAMES101 笔记 Lecture12 Geometry3

目录 Mesh Operations: Geometry ProcessingMesh Subdivision (曲面细分)Mesh Simplification(曲面简化)Mesh Regularization(曲面正则化) Subdivision(细分)Loop Subdivision(Loop细分)如何来调整顶点位置呢&#xff1f;Loop Subdivision Result (Loop细分的结果) Catmull-Cla…

大数据-Spark批处理实用广播Broadcast构建一个全局缓存Cache

1、broadcast广播 在Spark中&#xff0c;broadcast是一种优化技术&#xff0c;它可以将一个只读变量缓存到每个节点上&#xff0c;以便在执行任务时使用。这样可以避免在每个任务中重复传输数据。 2、构建缓存 import org.apache.spark.sql.SparkSession import org.apache.s…

【【51单片机11.0592晶振红外遥控】】

51单片机11.0592晶振红外遥控 红外遥控&#xff0c;51单片机完结 这是初步实现的架构 怎么实现内部的详细逻辑 我们用状态机的方法 0状态时一个空闲状态 当它接收到下降沿开始计时然后转为1状态 1状态下 寻找start 或者repeat的信号 再来下降沿读出定时器的值 如果是start 那…

Python爬虫基础知识点有哪些

目录 Python爬虫基础知识点 Requests库 Beautiful Soup库 正则表达式 数据存储 防止被反爬虫策略 爬虫调度和任务管理 认识robots.txt文件 反爬虫法律与道德 示例代码 Requests库 Beautiful Soup库 正则表达式 数据存储 防止被反爬虫策略 结语 网络世界中信息的…

如图,△ABC中,AD是角平分线,E、F分别为AC、AB上的点,且∠AED+∠AFD=180°.试问:DE与DF有何关系,并说明理由.

Question&#xff1a; 如图&#xff0c;△ABC中&#xff0c;AD是角平分线&#xff0c;E、F分别为AC、AB上的点&#xff0c;且∠AED∠AFD180&#xff0e;试问&#xff1a;DE与DF有何关系&#xff0c;并说明理由&#xff0e; Answer&#xff1a; 分析&#xff1a;过D作DM⊥AB于…

为 Google Play 即将推出基于区块链的内容政策做好准备

作者 / Joseph Mills, Group Product Manager, Google Play 作为一个平台&#xff0c;Google Play 一直致力于帮助开发者将创新理念变为现实。Google Play 上托管了许多和区块链相关的应用&#xff0c;我们深知合作伙伴们希望扩展这些应用&#xff0c;并利用 NFT 等代币化数字资…

两数相加 II——力扣445

题目描述 法一 栈 本题旨在从后往前加&#xff0c;为了逆序处理所有数位&#xff0c;利用栈&#xff0c;把数字压入栈中&#xff0c;再依次取出相加&#xff0c;注意进位&#xff01;进位是/10&#xff0c;另外需要注意栈的常用函数&#xff0c;push()、pop()、top()&#xff0…

Unity游戏源码分享-2.5D塔防类游戏

Unity游戏源码分享-2.5D塔防类游戏 项目地址&#xff1a; https://download.csdn.net/download/Highning0007/88118947

android存储4--初始化.emulated设备的挂载

android版本&#xff1a;android-11.0.0_r21http://aospxref.com/android-11.0.0_r21 android手机的挂载非常复杂。这篇文章针对emulated存储&#xff0c;介绍它的挂载过程。 一、为什么emulted存储要用很复杂的挂载方式 1&#xff0c; emulted存储是什么 android早期&#…

RCU 使用及机制源码的一些分析

》内核新视界文章汇总《 文章目录 1 介绍2 使用方法2.1 经典 RCU2.2 不可抢占RCU2.3 加速版不可抢占RCU2.4 链表操作的RCU版本2.5 slab 缓存支持RCU 3 源码与实现机制的简单分析3.1 数据结构3.2 不可抢占RCU3.3 加速版不可抢占RCU3.4 可抢占RCU3.5 报告禁止状态3.6 宽限期的开…

Photoshop2023beta常见问题|ps 2023测试版智能AI功能不能用如何解决?

PS beta ai创成式填充用不了怎么办 生成图像出错解决方法&#xff1f;PS 2023最新版本更新了超强大的AI功能&#xff0c;可以一键生成或删除用户选中的内容&#xff0c;这可大大提高了生成图片的效率。生成出来的图片也被公认为质量超高&#xff0c;虽然偶尔可能有点小瑕疵&…

vue2中开发时通过template中的div等标签自动输出对应的less形式带层级的class,只显示带class的

1.写完静态不是要写less吗&#xff0c;自动生成一下实现 this.getLevelClass(domId); domId是自定义的class名称&#xff0c;跟根据自己的需要设置 //vue2中开发时通过template中的div等标签自动输出对应的less形式带层级的class,只显示带class的getLevelClass(name) {let dom…