C++迭代器(Iterator)详解:从原理、使用方法到底层实现全面掌握

发布时间:2026/11/5 18:39:03

C++迭代器(Iterator)详解:从原理、使用方法到底层实现全面掌握 1. 什么是迭代器在C STLStandard Template Library标准模板库中迭代器iterator是连接容器和算法的桥梁。简单来说迭代器是一种类似指针的对象它可以访问容器中的元素并且能够遍历容器。例如vectorint v {1,2,3,4,5}; for(auto e : v) { cout e ; }这是C11提供的范围for本质上编译器帮我们使用了迭代器。实际上for(auto e : v)大致等价于auto begin v.begin(); auto end v.end(); while(begin ! end) { cout *begin ; begin; }这里begin()返回第一个元素的位置end()返回最后一个元素的下一个位置*begin获取元素begin移动到下一个元素2. 为什么需要迭代器2.1 不同容器底层结构不同STL中有很多容器容器底层结构vector动态数组list双向链表deque双端队列map红黑树unordered_map哈希表访问方式完全不同。例如vector内存连续------------ |10 |20 |30 |40 | ------------ 地址: 100 104 108 112可以通过指针移动ptr;list链表10 | v 20 | v 30 | v 40节点地址可能完全不连续1000 - 5000 - 2000无法ptr;因为下一个节点不一定在下一个地址。2.2 迭代器统一访问方式有了迭代器vectorvectorint::iterator it;listlistint::iterator it;mapmapint,int::iterator it;虽然底层完全不同但是遍历方式一样for(auto itcontainer.begin(); it!container.end(); it) { cout*it; }这就是STL设计思想不关心容器底层只通过迭代器访问元素。3. 迭代器的本质迭代器本质是一种类对象。例如vectorint::iterator it;实际上iterator是vector内部定义的一个类型。简单模拟templateclass T class VectorIterator { public: T* ptr; T operator*() { return *ptr; } VectorIterator operator() { ptr; return *this; } };这个类实现*!于是它就像指针一样使用。4. 迭代器的基本使用4.1 begin()返回第一个元素的位置vectorint v{1,2,3}; auto itv.begin(); cout*it;输出1结构begin() | v --------- | 1 | 2 | 3 | --------- ^ it4.2 end()返回最后一个元素后面的位置auto itv.end();注意end不是最后一个元素。而是------------- | 1 | 2 | 3 | | ------------- ^ end所以错误cout*v.end();这是非法访问。5. 使用迭代器遍历容器vector遍历#includeiostream #includevector using namespace std; int main() { vectorint v{1,2,3,4}; vectorint::iterator itv.begin(); while(it!v.end()) { cout*it ; it; } return 0; }输出1 2 3 46. auto简化迭代器以前vectorint::iterator it;非常长。C11auto itv.begin();编译器自动推导类型。推荐for(auto itv.begin(); it!v.end(); it) { cout*it; }7. const_iterator普通迭代器iterator可以修改元素。例如vectorint v{1,2,3}; auto itv.begin(); *it100;结果100 2 3但是如果只想读取使用const_iterator例如vectorint::const_iterator it; itv.begin();此时*it100;错误。原因不能通过const迭代器修改数据。8. reverse_iterator反向迭代器普通迭代器方向begin() | v 1 2 3 4反向迭代器rbegin() 4 3 2 1使用vectorint v{1,2,3,4}; auto itv.rbegin(); while(it!v.rend()) { cout*it ; it; }输出4 3 2 19. 五种迭代器类型STL根据功能不同把迭代器分为五类。9.1 输入迭代器Input Iterator特点只能读取。支持* !例如读取文件istream_iterator9.2 输出迭代器Output Iterator只能写。例如ostream_iterator用于输出copy(v.begin(), v.end(), ostream_iteratorint(cout, ));9.3 前向迭代器Forward Iterator支持读取写入移动例如forward_list9.4 双向迭代器Bidirectional Iterator支持向前向后--例如list map set9.5 随机访问迭代器Random Access Iterator功能最强。支持 - [] 例如vectorit5dequeit-2迭代器能力关系Random Access | Bidirectional | Forward Iterator | Input Iterator能力越往上越强。10. 不同容器迭代器类型容器迭代器类型vector随机访问deque随机访问array随机访问list双向map双向set双向forward_list前向unordered_map前向11. 迭代器失效问题重点这是面试高频问题。所谓迭代器失效迭代器仍然保存地址但是这个地址已经不是有效元素。11.1 vector插入导致失效例如vectorint v{1,2,3}; auto itv.begin(); v.push_back(4); cout*it;可能错误。原因vector扩容原空间1000: 1 2 3扩容5000: 1 2 3 4旧地址释放。it仍指向1000。失效。11.2 vector删除导致失效vectorint v{1,2,3}; auto itv.begin(); v.erase(it);删除后2 3原来的it失效。11.3 list迭代器失效listnode1 - node2 - node3删除node2node1 - node3只有删除节点的迭代器失效。其他迭代器仍有效。12. erase正确使用方式错误for(auto itv.begin(); it!v.end(); it) { if(*it3) v.erase(it); }原因erase后it失效。正确for(auto itv.begin(); it!v.end();) { if(*it3) { itv.erase(it); } else { it; } }因为vector/list的erase会返回删除位置后的迭代器。13. 迭代器和指针区别很多人认为迭代器就是指针。不完全正确。指针直接操作地址int* p;只能访问内存。迭代器是一种抽象。可能是指针是类对象例如vectoriterator ≈ T*listiterator: { Node* node; }14. 迭代器和算法STL算法sort find copy reverse都使用迭代器。例如排序vectorint v{3,1,2}; sort(v.begin(), v.end());sort不知道vector是什么数据在哪里它只认识begin() end() *15. 迭代器底层思想STL采用泛型编程算法templateclass Iterator void sort(Iterator first, Iterator last)不关心类型。只要求这个Iterator满足随机访问能力。这就是面向接口编程。16. 常用迭代器接口总结函数作用begin()返回头迭代器end()返回尾后迭代器rbegin()返回反向头rend()返回反向尾cbegin()const开始cend()const结束17. 迭代器总结什么是迭代器迭代器是STL中用于访问容器元素的一种对象本质是对指针的封装。为什么需要迭代器因为不同容器底层不同统一算法访问方式核心使用auto itcontainer.begin(); while(it!container.end()) { cout*it; it; }必须掌握begin/enditeratorconst_iteratorreverse_iterator五种迭代器分类迭代器失效STL算法与迭代器关系
延伸阅读

更多相关文章

2026/11/4 16:37:33

远程工具实测:UU · 远程 10 项核心深度解析

一、前言 远程办公这件事,一旦用顺了,就真的回不去工位了。出差路上改方案、晚上躺床上回紧急邮件、周末帮爸妈处理电脑小毛病、在公司远程家里的电脑跑编译……远程控制软件早就不是"极客玩具",而是打工人的日常生产力工具。 我深…

2026/11/4 21:44:18

Unity与Cocos Creator深度对比:从设计哲学到项目选型实战指南

1. 项目概述:为什么需要对比学习Unity与Cocos Creator?作为一名在游戏开发一线摸爬滚打了十多年的老码农,我见过太多新手和团队在引擎选型上踩坑。有人上来就抱着“Unity是3D老大,Cocos是2D王者”的刻板印象一头扎进去&#xff0c…

2026/11/3 23:51:04

MakerBot应用门户:3D打印从硬件到开放生态的最后一公里

1. 项目概述:当3D打印机遇上“应用商店”最近,MakerBot作为桌面级3D打印领域的老牌玩家,推出了一个名为“应用门户”的新玩意儿。这消息一出,在创客圈和数字化制造领域里,激起了不小的水花。简单来说,这个“…

2026/11/5 16:51:33

EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析

1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被…

2026/11/5 16:26:13

Rust原来很简单二:所有权系统

Part 2 核心篇 —— 所有权系统 本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理 6…

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑