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

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

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

💯什么是迭代器?
迭代器(Iterator)是 C++ 标准模板库中的一种对象,专为遍历容器中的元素而设计。它的工作方式类似于指针,但具备更多功能。
迭代器的主要特点包括:
- 抽象化:通过统一的接口操作不同类型的容器(如
vector、string、list等)。 - 灵活性:支持顺序遍历、逆序遍历,以及访问和修改容器中的元素。
- 安全性:迭代器相比裸指针更安全,更符合现代 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",其下标和迭代器关系如下:
| 下标 | 0 | 1 | 2 | 3 | 4 | 5 | - |
|---|---|---|---|---|---|---|---|
| 字符 | a | b | c | d | e | f | |
| 迭代器 | s.begin() → | s.end() → |
s.begin()返回指向第一个字符(即a)的迭代器。s.end()返回指向超出最后一个字符的迭代器位置(并非f的位置,而是f后面的位置)。- 在输出中:
it1 < it2判断迭代器的位置关系,结果为true(即1)。it1 - it2计算迭代器间的距离,结果为-6,表示从起点到终点有 6 个字符。
小提示
- 迭代器支持大小比较(
<、>等),也支持加减整数(it + n、it - 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++ 中其他容器(如 vector、map 等)感兴趣,迭代器同样适用,甚至更为强大,欢迎进一步探索!

![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
相关文章:
【C++】深入理解迭代器(Iterator)
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯什么是迭代器?迭代器与指针的比较 💯std::string 中的迭代器示例代码与图示分析运行结果:图示说明: 小提示 💯正…...
后端Java开发:第十二天
第十二天:封装 - 理解与应用 欢迎来到今天的学习内容!今天,我们将一起深入探讨 Java 中的 封装(Encapsulation)。封装是面向对象编程的四大基本特性之一,它的核心思想是把对象的状态(属性&…...
记录一下Coding一直不能clone
配置 下载git客户端,进行配置 git config --list user.name姓名全称 user.emailIAM_xxxxxx.com ,这个就是你的邮箱地址 user.signingkey 注册coding平台的密码 一般不需要配置公钥私钥 下载TortoiseGit,配置这几个参数 配置凭据管理器 注意 这里用户名是…...
LLM加速方法,Adapter Tuning和Prompt Tuning的区别及原理举例
LLM加速方法 目录 LLM加速方法整体结构各分支内容Adapter Tuning和Prompt Tuning的区别及原理举例一、区别二、总结整体结构 基于模型微调、基于模型压缩、基于分布式并行处理。 各分支内容 基于模型微调: 包含Adapter Tuning、Prompt Tuning、LoRA三个子类别。这些技术主要…...
【SVN】版本发布快捷操作
摘要:因为每次发版都需要制作一份相同的文件夹,而大部分的包都不需要变更,但是文件又非常大,记录自己的操作经验。 首先在SVN Repository Browser 界面把上一次的版本复制一份,复制的时候重命名为新的版本号 右击要复…...
GitLab 创建项目、删除项目
1、创建项目 点击左上角图标,回到首页 点击 Create a project 点击 Create blank project 输入项目名称,点击Create Project 创建成功 2、删除项目 进入项目列表 点击对应项目,进入项目 进入Settings页面 拖到页面底部,展开Adva…...
STM32-笔记37-吸烟室管控系统项目
一、项目需求 1. 使用 mq-2 获取环境烟雾值,并显示在 LCD1602 上; 2. 按键修改阈值,并显示在 LCD1602 上; 3. 烟雾值超过阈值时,蜂鸣器长响,风扇打开;烟雾值小于阈值时,蜂鸣器不响…...
VisionPro软件Image Stitch拼接算法
2D图像拼接的3种情景 1.一只相机取像位置固定,或者多只相机固定位置拍图,硬拷贝拼图,采用CopyRegion工具实现 2.一只或多只相机在多个位置拍照,相机视野互相重叠,基于Patmax特征定位后,无缝 拼图ÿ…...
【从零开始入门unity游戏开发之——unity篇09】unity6基础入门——Unity游戏对象和组件的本质、Unity中的反射机制
文章目录 一、Unity游戏对象和组件的本质1、开发游戏的本质2、万物之根本——空对象2.1 什么是空对象?2.2 创建空对象 3、Unity游戏对象的本质4、 transform组件4.1 transform组件的重要性4.2 修改transform的值4.4 **Transform的作用**4.3 重置transform的值 5、总…...
【Linux】深入理解文件系统(超详细)
目录 一.磁盘 1-1 磁盘、服务器、机柜、机房 📌补充: 📌通常网络中用高低电平,磁盘中用磁化方向来表示。以下是具体说明: 📌如果有一块磁盘要进行销毁该怎么办? 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 类模型明确表明,增加参数数量可以提高性能,因此谷歌使用 GShard 尝试将 Transformer 模型…...
在Linux中,如何禁用root用户直接SSH登录?
在Linux中禁用root用户的直接SSH登录是为了增强系统的安全性,因为允许root用户通过SSH远程登录会增加服务器被暴力破解的风险。以下是在Linux系统中禁止root用户直接SSH登录的步骤: 编辑SSH配置文件: 打开/etc/ssh/sshd_config文件ÿ…...
用Python实现简单的任务自动化
目录 1. 自动发送邮件提醒 2. 自动备份文件 3. 自动下载网页内容 总结 在现代工作和生活中,任务自动化可以极大地提高效率和准确性。Python,作为一种功能强大且易于学习的编程语言,是实现任务自动化的理想选择。本文将通过几个简单而实用的案例,展示如何用Python实现任…...
为AI聊天工具添加一个知识系统 之26 资源存储库和资源管理器
本文要点 资源存储库 为了能完成本项目(“为AI聊天工具增加一个知识系统”,其核心能力是“语言处理” ,该能力的最大挑战 当仁不让的应该是自然语言处理)的设计,我们考虑一个问题:在自然语言处理中&#…...
Windows10环境下安装RabbitMq折腾记
最近有个老项目需要迁移到windows10环境,用的是比较老的rabbitmq安装包,如下所示。经过一番折腾,死活服务起不来,最终果断放弃老版本启用新版本。现在把折腾过程记录下: 一、安装erlang 安装完成后的目录结构ÿ…...
对快速由表及里说拜拜/如何正确运用由表及里
你是不是还:看到一男子拖走一女子就以为小情侣吵架而已(可能人贩子);看到男友对你好个几次就从此死心塌地(可能有手就行,细节装装而已)结果耽误终身;看到女同事对你微笑不排斥就以为…...
spring mvc源码学习笔记之八
本文说点儿简单的。 如果你想研究基于 XML 配置的 spring mvc 的话,可以简单扫一眼本文。 在基于 XML 配置的 spring mvc 开发中,我们主要就是通过 spring 提供的各种标签来配置。 但是,大家是不是都有个疑问,spring 到底给我们提…...
探秘5网口IIOT网关
在当今这个科技飞速发展的时代,工业领域正经历着一场深刻的变革,而工业物联网网关在其中扮演着至关重要的角色。 什么是IIOT网关 工业物联网网关,简单来说,就是连接工业现场设备与云端或者上层管理系统的关键桥梁。 而明达技术研…...
左神算法基础巩固--5
文章目录 前缀树生成前缀树查询前缀树查询字符串加入过几次查询所有加入的字符串中,有几个是以pre这个字符串作为前缀 删除前缀树中的某个字符串 贪心算法解题 前缀树 生成前缀树 要想生成一棵前缀树,需要先创建一个根节点,这个根节点有26条…...
Python的Matplotlib库应用(超详细教程)
目录 一、环境搭建 1.1 配置matplotlib库 1.2 配置seaborn库 1.3 配置Skimage库 二、二维图像 2.1 曲线(直线)可视化 2.2 曲线(虚线)可视化 2.3 直方图 2.4 阶梯图 三、三维图像 3.1 3D曲面图 3.2 3D散点图 3.3 3D散…...
PFC(Power Factor Correction,功率因数校正)
PFC电路的用处用处1:迫使电流与电压同相位,使得用电设备对于电网而言相当于纯阻性负载。当负载呈感性时:电流滞后电压;呈容性时:电流超前电压功率因数越大(接近1.0)说明设备性能越好,…...
(29)UGameInstance 、UGameInstanceSubsystem 与 UGameState 的区别,一言
(52)接着:(53) 谢谢...
游戏音频解密全流程:acbDecrypter高效处理指南
游戏音频解密全流程:acbDecrypter高效处理指南 【免费下载链接】acbDecrypter 项目地址: https://gitcode.com/gh_mirrors/ac/acbDecrypter 在游戏开发与音频 mod 创作中,如何突破加密音频格式的限制,将 ACB、HCA、ADX 等专用格式转换…...
OpenClaw+千问3.5-9B智能监控:服务器日志异常自动告警
OpenClaw千问3.5-9B智能监控:服务器日志异常自动告警 1. 为什么需要智能日志监控? 去年我负责维护的一个内部项目突然在凌晨崩溃,直到第二天上班才发现。查看日志才发现,其实系统在崩溃前2小时就已经开始报错——如果能实时捕获…...
WPF新手村教程(七)—— 终章(MVVM架构初见杀)陶
1. 哑铃图是什么? 哑铃图(Dumbbell Plot),有时也称为DNA图或杠铃图,是一种用于比较两个相关数据点的可视化图表。 它源于人们对更有效数据比较方式的持续探索。 在传统的时间序列比较中,我们通常使用两条折…...
把 Flask 搬进 ESP,高中生自研嵌入式 Web 框架 MicroFlask !唤
如果有多个供应商,你也可以使用 [[CC-Switch]] 来可视化管理这些API key,以及claude code 的skills。 # 多平台安装指令 curl -fsSL https://claude.ai/install.sh | bash ## Claude Code 配置 GLM Coding Plan curl -O "https://cdn.bigmodel.cn/i…...
从手写试卷到智能评分:OCRAutoScore如何重塑教育评估体验
从手写试卷到智能评分:OCRAutoScore如何重塑教育评估体验 【免费下载链接】OCRAutoScore OCR自动化阅卷项目 项目地址: https://gitcode.com/gh_mirrors/oc/OCRAutoScore 作为一名教育工作者,你是否曾为堆积如山的试卷批改而苦恼?每学…...
RAGAS 了解吗?它的评估指标有哪些?评估流程是怎样的?评估数据如何获取和构造?
1. 题目分析做过 RAG 项目的人大概都有过这种体验:系统搭完了,效果怎么样?说好也行,说不好也行,全凭主观感觉。你觉得检索结果挺相关的,老板觉得回答不够精准;你觉得答案已经很准了,…...
数据库回顾
题目:584. 寻找用户推荐人 表: Customer ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | | referee_id | int | ---------------------- 在 SQL 中,id 是该表的…...
我不是狐狸,我是那Harness Engineering涯
Julia(julialang.org)由Stefan Karpinski、Jeff Bezanson等在2009年创建,目标是融合Python的易用性、C的高性能、R的统计能力、Matlab的科学计算生态。 其核心设计哲学是: 高性能:编译型语言(JIT࿰…...
