当前位置: 首页 > news >正文

【C++】深入理解迭代器(Iterator)


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯什么是迭代器?
    • 迭代器与指针的比较
  • 💯`std::string` 中的迭代器
    • 示例代码与图示分析
      • 运行结果:
      • 图示说明:
    • 小提示
  • 💯正序遍历与逆序遍历
    • 正序遍历
      • 示例代码
      • 运行结果
    • 逆序遍历
      • 示例代码
      • 运行结果
      • 注意
  • 💯修改字符串内容
      • 示例代码
      • 运行结果
    • 解释
  • 💯拓展:迭代器的更多功能
    • 迭代器类型
    • 常用 STL 算法与迭代器
      • 示例:查找特定字符
  • 💯小结


在这里插入图片描述


💯前言

  • C++ 是一门功能强大的编程语言,其标准库(STL, Standard Template Library)提供了多种高效的工具来处理数据。其中,迭代器(Iterator)是一种极为重要的工具,可以帮助开发者优雅地操作容器,遍历、访问和修改数据。迭代器的作用类似于指针,但比指针更强大和灵活。本文将以 std::string 为例,结合代码和图示,从基本概念到实际应用,带领读者深入理解 C++ 中迭代器的核心功能和用法。
    C++ 参考手册
    在这里插入图片描述

💯什么是迭代器?

迭代器(Iterator)是 C++ 标准模板库中的一种对象,专为遍历容器中的元素而设计。它的工作方式类似于指针,但具备更多功能。

迭代器的主要特点包括:

  • 抽象化:通过统一的接口操作不同类型的容器(如 vectorstringlist 等)。
  • 灵活性:支持顺序遍历、逆序遍历,以及访问和修改容器中的元素。
  • 安全性:迭代器相比裸指针更安全,更符合现代 C++ 的编程规范。

在迭代器的使用过程中,特别需要注意访问迭代器指向的值时必须解引用(* 操作符)。

迭代器与指针的比较

迭代器和指针有许多相似之处,例如它们都可以通过递增(++)、递减(--)、解引用(*)来访问和操作数据。但是,迭代器是针对容器设计的,它们具有更强的抽象能力,可以屏蔽容器的底层实现,从而使代码更通用和易维护。

💯std::string 中的迭代器

C++ 中的 std::string 提供了多种迭代器,用于遍历字符串中的字符和修改字符串的内容。下面是我们将重点讨论的两个基本方法:

  • begin():返回指向字符串第一个字符的迭代器。
  • end():返回指向字符串最后一个字符的下一个位置的迭代器。

示例代码与图示分析

让我们通过具体的代码和图示来理解 begin()end() 的用法。

#include <iostream>
#include <string>
using namespace std;int main() {string s = "abcdef";string::iterator it1 = s.begin();string::iterator it2 = s.end();cout << (it1 < it2) << endl;cout << it1 - it2 << endl;return 0;
}

运行结果:

1
-6

图示说明:

假设字符串 s = "abcdef",其下标和迭代器关系如下:

下标012345-
字符abcdef
迭代器s.begin()s.end()
  • s.begin() 返回指向第一个字符(即 a)的迭代器。
  • s.end() 返回指向超出最后一个字符的迭代器位置(并非 f 的位置,而是 f 后面的位置)。
  • 在输出中:
    • it1 < it2 判断迭代器的位置关系,结果为 true(即 1)。
    • it1 - it2 计算迭代器间的距离,结果为 -6,表示从起点到终点有 6 个字符。

小提示

  • 迭代器支持大小比较(<> 等),也支持加减整数(it + nit - n)。
  • 两个迭代器相减的结果是它们之间的元素个数。
  • 迭代器的灵活操作为字符串的高效遍历和操作提供了保障。

💯正序遍历与逆序遍历

正序遍历

正序遍历是迭代器最常见的应用方式,从字符串的起始位置到结束位置依次访问每个字符。

示例代码

#include <iostream>
#include <string>
using namespace std;int main() {string s = "abcdef";// 使用 auto 自动推导迭代器类型for (auto it = s.begin(); it != s.end(); ++it) {cout << *it << ' ';}// 或者显式声明迭代器类型for (string::iterator it = s.begin(); it != s.end(); ++it) {cout << *it << ' ';}return 0;
}

运行结果

a b c d e f

逆序遍历

逆序遍历则是从字符串的末尾位置开始,逐步向前遍历。

示例代码

#include <iostream>
#include <string>
using namespace std;int main() {string s = "abcdef";for (string::iterator it = s.end() - 1; it >= s.begin(); --it) {cout << *it << ' ';}return 0;
}

运行结果

f e d c b a

注意

逆序遍历中,s.end() - 1 指向最后一个字符,而不是 s.end()

💯修改字符串内容

迭代器不仅可以用于遍历,还可以直接修改容器中的内容。

示例代码

#include <iostream>
#include <string>
using namespace std;int main() {string str = "abcdef";// 修改前输出原字符串cout << str << endl;// 使用迭代器修改字符串for (string::iterator it = str.begin(); it != str.end(); ++it) {*it = 'x'; // 修改每个字符为 'x'}// 修改后输出新字符串cout << str << endl;return 0;
}

运行结果

abcdef
xxxxxx

解释

通过迭代器访问字符串中的每个字符,并使用 *it = 'x' 将其修改为 x,实现了对原字符串的就地修改。


💯拓展:迭代器的更多功能

迭代器类型

C++ 提供了多种迭代器,常见的有:

  • 输入迭代器(Input Iterator):只读访问容器中的元素。
  • 输出迭代器(Output Iterator):只写访问容器中的元素。
  • 前向迭代器(Forward Iterator):支持单向遍历。
  • 双向迭代器(Bidirectional Iterator):支持正序和逆序遍历(如 string::iterator)。
  • 随机访问迭代器(Random Access Iterator):支持随机访问容器中的任意元素(如 vector 的迭代器)。

常用 STL 算法与迭代器

C++ STL 提供了大量算法,可以与迭代器配合使用,例如:

  • std::find:查找特定元素。
  • std::sort:排序。
  • std::copy:复制容器内容。

示例:查找特定字符

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;int main() {string s = "abcdef";auto it = find(s.begin(), s.end(), 'c');if (it != s.end()) {cout << "Found: " << *it << endl;} else {cout << "Not Found" << endl;}return 0;
}

💯小结

通过本文的详细分析,我们可以看到,迭代器是 C++ STL 中操作容器的核心工具。无论是遍历、修改还是配合算法使用,迭代器都能够提供高效且优雅的解决方案。本文以 std::string 为例,结合代码和图示,讲解了迭代器的基本用法,并拓展了迭代器的更多应用场景。

迭代器的灵活性为开发者带来了极大的便利,但也需要我们在使用时注意边界条件和逻辑错误。如果你对 C++ 中其他容器(如 vectormap 等)感兴趣,迭代器同样适用,甚至更为强大,欢迎进一步探索!


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

相关文章:

【C++】深入理解迭代器(Iterator)

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;什么是迭代器&#xff1f;迭代器与指针的比较 &#x1f4af;std::string 中的迭代器示例代码与图示分析运行结果&#xff1a;图示说明&#xff1a; 小提示 &#x1f4af;正…...

后端Java开发:第十二天

第十二天&#xff1a;封装 - 理解与应用 欢迎来到今天的学习内容&#xff01;今天&#xff0c;我们将一起深入探讨 Java 中的 封装&#xff08;Encapsulation&#xff09;。封装是面向对象编程的四大基本特性之一&#xff0c;它的核心思想是把对象的状态&#xff08;属性&…...

记录一下Coding一直不能clone

配置 下载git客户端&#xff0c;进行配置 git config --list user.name姓名全称 user.emailIAM_xxxxxx.com ,这个就是你的邮箱地址 user.signingkey 注册coding平台的密码 一般不需要配置公钥私钥 下载TortoiseGit&#xff0c;配置这几个参数 配置凭据管理器 注意 这里用户名是…...

LLM加速方法,Adapter Tuning和Prompt Tuning的区别及原理举例

LLM加速方法 目录 LLM加速方法整体结构各分支内容Adapter Tuning和Prompt Tuning的区别及原理举例一、区别二、总结整体结构 基于模型微调、基于模型压缩、基于分布式并行处理。 各分支内容 基于模型微调: 包含Adapter Tuning、Prompt Tuning、LoRA三个子类别。这些技术主要…...

【SVN】版本发布快捷操作

摘要&#xff1a;因为每次发版都需要制作一份相同的文件夹&#xff0c;而大部分的包都不需要变更&#xff0c;但是文件又非常大&#xff0c;记录自己的操作经验。 首先在SVN Repository Browser 界面把上一次的版本复制一份&#xff0c;复制的时候重命名为新的版本号 右击要复…...

GitLab 创建项目、删除项目

1、创建项目 点击左上角图标&#xff0c;回到首页 点击 Create a project 点击 Create blank project 输入项目名称&#xff0c;点击Create Project 创建成功 2、删除项目 进入项目列表 点击对应项目&#xff0c;进入项目 进入Settings页面 拖到页面底部&#xff0c;展开Adva…...

STM32-笔记37-吸烟室管控系统项目

一、项目需求 1. 使用 mq-2 获取环境烟雾值&#xff0c;并显示在 LCD1602 上&#xff1b; 2. 按键修改阈值&#xff0c;并显示在 LCD1602 上&#xff1b; 3. 烟雾值超过阈值时&#xff0c;蜂鸣器长响&#xff0c;风扇打开&#xff1b;烟雾值小于阈值时&#xff0c;蜂鸣器不响…...

VisionPro软件Image Stitch拼接算法

2D图像拼接的3种情景 1.一只相机取像位置固定&#xff0c;或者多只相机固定位置拍图&#xff0c;硬拷贝拼图&#xff0c;采用CopyRegion工具实现 2.一只或多只相机在多个位置拍照&#xff0c;相机视野互相重叠&#xff0c;基于Patmax特征定位后&#xff0c;无缝 拼图&#xff…...

【从零开始入门unity游戏开发之——unity篇09】unity6基础入门——Unity游戏对象和组件的本质、Unity中的反射机制

文章目录 一、Unity游戏对象和组件的本质1、开发游戏的本质2、万物之根本——空对象2.1 什么是空对象&#xff1f;2.2 创建空对象 3、Unity游戏对象的本质4、 transform组件4.1 transform组件的重要性4.2 修改transform的值4.4 **Transform的作用**4.3 重置transform的值 5、总…...

【Linux】深入理解文件系统(超详细)

目录 一.磁盘 1-1 磁盘、服务器、机柜、机房 &#x1f4cc;补充&#xff1a; &#x1f4cc;通常网络中用高低电平&#xff0c;磁盘中用磁化方向来表示。以下是具体说明&#xff1a; &#x1f4cc;如果有一块磁盘要进行销毁该怎么办&#xff1f; 1-2 磁盘存储结构 ​编辑…...

MoEs and Transformers 笔记

ref:https://huggingface.co/blog/zh/moe#%E7%94%A8router-z-loss%E7%A8%B3%E5%AE%9A%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83 MoEs and Transformers Transformer 类模型明确表明&#xff0c;增加参数数量可以提高性能&#xff0c;因此谷歌使用 GShard 尝试将 Transformer 模型…...

在Linux中,如何禁用root用户直接SSH登录?

在Linux中禁用root用户的直接SSH登录是为了增强系统的安全性&#xff0c;因为允许root用户通过SSH远程登录会增加服务器被暴力破解的风险。以下是在Linux系统中禁止root用户直接SSH登录的步骤&#xff1a; 编辑SSH配置文件&#xff1a; 打开/etc/ssh/sshd_config文件&#xff…...

用Python实现简单的任务自动化

目录 1. 自动发送邮件提醒 2. 自动备份文件 3. 自动下载网页内容 总结 在现代工作和生活中,任务自动化可以极大地提高效率和准确性。Python,作为一种功能强大且易于学习的编程语言,是实现任务自动化的理想选择。本文将通过几个简单而实用的案例,展示如何用Python实现任…...

为AI聊天工具添加一个知识系统 之26 资源存储库和资源管理器

本文要点 资源存储库 为了能完成本项目&#xff08;“为AI聊天工具增加一个知识系统”&#xff0c;其核心能力是“语言处理” &#xff0c;该能力的最大挑战 当仁不让的应该是自然语言处理&#xff09;的设计&#xff0c;我们考虑一个问题&#xff1a;在自然语言处理中&#…...

Windows10环境下安装RabbitMq折腾记

最近有个老项目需要迁移到windows10环境&#xff0c;用的是比较老的rabbitmq安装包&#xff0c;如下所示。经过一番折腾&#xff0c;死活服务起不来&#xff0c;最终果断放弃老版本启用新版本。现在把折腾过程记录下&#xff1a; 一、安装erlang 安装完成后的目录结构&#xff…...

对快速由表及里说拜拜/如何正确运用由表及里

你是不是还&#xff1a;看到一男子拖走一女子就以为小情侣吵架而已&#xff08;可能人贩子&#xff09;&#xff1b;看到男友对你好个几次就从此死心塌地&#xff08;可能有手就行&#xff0c;细节装装而已&#xff09;结果耽误终身&#xff1b;看到女同事对你微笑不排斥就以为…...

spring mvc源码学习笔记之八

本文说点儿简单的。 如果你想研究基于 XML 配置的 spring mvc 的话&#xff0c;可以简单扫一眼本文。 在基于 XML 配置的 spring mvc 开发中&#xff0c;我们主要就是通过 spring 提供的各种标签来配置。 但是&#xff0c;大家是不是都有个疑问&#xff0c;spring 到底给我们提…...

探秘5网口IIOT网关

在当今这个科技飞速发展的时代&#xff0c;工业领域正经历着一场深刻的变革&#xff0c;而工业物联网网关在其中扮演着至关重要的角色。 什么是IIOT网关 工业物联网网关&#xff0c;简单来说&#xff0c;就是连接工业现场设备与云端或者上层管理系统的关键桥梁。 而明达技术研…...

左神算法基础巩固--5

文章目录 前缀树生成前缀树查询前缀树查询字符串加入过几次查询所有加入的字符串中&#xff0c;有几个是以pre这个字符串作为前缀 删除前缀树中的某个字符串 贪心算法解题 前缀树 生成前缀树 要想生成一棵前缀树&#xff0c;需要先创建一个根节点&#xff0c;这个根节点有26条…...

Python的Matplotlib库应用(超详细教程)

目录 一、环境搭建 1.1 配置matplotlib库 1.2 配置seaborn库 1.3 配置Skimage库 二、二维图像 2.1 曲线&#xff08;直线&#xff09;可视化 2.2 曲线&#xff08;虚线&#xff09;可视化 2.3 直方图 2.4 阶梯图 三、三维图像 3.1 3D曲面图 3.2 3D散点图 3.3 3D散…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...