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

news2024/11/15 21:48:22

在这里插入图片描述

🚀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.coloradmin.cn/o/806439.html

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

相关文章

【Linux】- RPM 与 YUM

RPM 与 YUM 1.1 rpm 包的管理1.2 rpm 包的简单查询指令1.3 rpm 包的其它查询指令&#xff1a;1.4 卸载 rpm 包&#xff1a;2.1 安装 rpm 包3.1 yum3.2 yum 的基本指令3.3 安装指定的 yum 包3.4 yum 应用实例&#xff1a; 1.1 rpm 包的管理 介绍 rpm 用于互联网下载包的打包及安…

SDN系统方法 | 9. 接入网

随着互联网和数据中心流量的爆炸式增长&#xff0c;SDN已经逐步取代静态路由交换设备成为构建网络的主流方式&#xff0c;本系列是免费电子书《Software-Defined Networks: A Systems Approach》的中文版&#xff0c;完整介绍了SDN的概念、原理、架构和实现方式。原文: Softwar…

【Spring Boot丨序列化、反序列化】

序列化、反序列化 概述Jackson 序列化和反序列化简介自定义序列化器注册外部序列化程序&#xff1a; 指定类的 Json 序列化、反序列化 主页传送门&#xff1a;&#x1f4c0; 传送 概述 序列化是将对象转换为字节序列的过程&#xff0c;而反序列化则是将字节序列恢复为对象的过…

用于系统监控及进程管理python库之psutil

前言 对于一个job级别应用再进行测试的过程中&#xff0c;不可避免测试该服务的一些性能&#xff0c;比如占有cpu的使用量&#xff0c;使用的memory的大小等&#xff0c;比较简单的方式是在服务中起一个并行的线程&#xff0c;每隔一段时间打印这些关注量的大小&#xff0c;之后…

【二分答案】CF1661 C

Problem - C - Codeforces 题意&#xff1a; 思路&#xff1a; 在check的时候&#xff0c;我们要尽量用算贡献的思想&#xff0c;并且大胆贪心 Code&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn3e510; const int mxe3…

MySQL基础扎实——列对比运算符是什么

词义解释 在MySQL中&#xff0c;用于进行列对比的运算符主要有以下几种&#xff0c;其实就是逻辑运算符号&#xff1a; 等号&#xff08;&#xff09;&#xff1a;用于判断两个列是否相等&#xff0c;例如&#xff1a;column_name value。 不等号&#xff08;<>或!&am…

Verilog语法学习——边沿检测

边沿检测 代码 module edge_detection_p(input sys_clk,input sys_rst_n,input signal_in,output edge_detected );//存储上一个时钟周期的输入信号reg signal_in_prev;always (posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)signal_in_prev < 0;else…

95. Python基础教程:异常处理try...except语句

【目录】 文章目录 1. try...except语法解析2. 程序异常3. except的4种使用方式3.1 单独的except3.2 except 异常名称3.3 except 异常类型 as 别名3.4 except (异常类型1,异常类型2) as 别名 4. 总结 【正文】 1. try…except语法解析 try[traɪ]&#xff1a;尝试。 except[…

【QT】Day4

1> 思维导图 2> 手动完成服务器的实现&#xff0c;并具体程序要注释清楚 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QMessageBox> //…

综合能源系统(4)——综合能源系统建模方法

综合能源系统关键技术与典型案例  何泽家&#xff0c;李德智主编 本文主要从物理、信息、价值三个方面介绍综合能源系统关键技术&#xff0c;如图3-1所示。 物理方面&#xff1a;主要包括综合能源系统建模分析技术、规划设计(配置)技术、优化控制技术、运行维护技术和综合评…

mybatisPlus之逻辑删除解读

目录 为什么会有逻辑删除 逻辑删除基本介绍 逻辑删除的使用 局部使用 全局使用 为什么会有逻辑删除 在我们对数据进行增删查改的时候&#xff0c;对于删除操作来说&#xff0c;我们思考一个问题&#xff0c;在实际开发中我们真的会将数据完成从数据库中删除掉么&#xff1f…

二叉搜索树(二叉排序树)

文章目录 基本概念基本操作实现分析插入数据查找数据删除数据遍历数据 源码 基本概念 二叉搜索树也叫搜索二叉树、二叉排序树、排序二叉树。是一种对查找和排序都有用的特殊二叉树。 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09; 如何构建一颗二叉…

【使用维纳滤波进行信号分离】基于维纳-霍普夫方程的信号分离或去噪维纳滤波器估计(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

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

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

二叉搜索树的本质

引言 打算写写树形数据结构&#xff1a;二叉查找树、红黑树、跳表和 B 树。这些数据结构都是为了解决同一个基本问题&#xff1a;如何快速地对一个大集合执行增删改查。 本篇是第一篇&#xff0c;讲讲搜索树的基础&#xff1a;二叉搜索树。 基本问题 如何在一千万个手机号中…

设计模式-中介者模式在Java中使用示例-客户信息管理

场景 欲开发客户信息管理窗口界面&#xff0c;界面组件之间存在较为复杂的交互关系&#xff1a;如果删除一个客户&#xff0c; 要在客户列表(List)中删掉对应的项&#xff0c;客户选择组合框(ComboBox)中客户名称也将减少一个&#xff1b; 如果增加一个客户信息&#xff0c;…

SpringBoot2.7集成Swagger3.0和knife4j实现API接口文档开发

1. 概述 Swagger 3 是一个用于描述、构建和测试 RESTful Web 服务的开源工具集。它提供了一种简单而强大的方式来定义和文档化 API 接口&#xff0c;同时还具备自动生成客户端代码和服务器存根代码的功能。 Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案&#xff…

DNSPod十问秦勇:为什么医疗AI最爱眼科?

本期嘉宾 秦勇 鹰瞳科技Airdoc COO 秦勇&#xff0c;鹰瞳科技&#xff08;Airdoc&#xff09;COO&#xff0c;中国人工智能学会智慧医疗专委会委员&#xff0c;长期从事医疗人工智能方向的工作&#xff0c;拥有丰厚的项目经验、管理经验和技术积累&#xff0c;参与多个医院人…

掌握Python的X篇_13+14_Python条件语句实例:判断闰年、成绩评定

前面学习了条件语句以及调试的基本技巧&#xff0c;本篇介绍两个与条件语句有关的实例&#xff0c;对前面的知识又深刻认识。 文章目录 1. 判断闰年1.1 版本11.2 版本21.3 一行代码太长的处理方法 2. 根据成绩评级 1. 判断闰年 用户输入年份&#xff0c;判断该年份是否为闰年…

基于springboot+jpa+mysql+html网上中药商城系统

基于springbootjpamysqlhtml网上中药商城系统 一、系统介绍二、功能展示1.主页(客户)2.登陆&#xff08;客户&#xff09;3.注册&#xff08;客户&#xff09;4.购物车(客户)5.我的订单&#xff08;客户&#xff09;6.用户管理&#xff08;管理员&#xff09;7.分类管理&#x…