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

发布时间:2026/9/14 15:01:32

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/9/10 3:33:44

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

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

2026/9/13 11:41:16

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

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

2026/9/14 14:04:13

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

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

2026/9/14 18:05:15

手把手搭建直播高并发后端:从Netty长连接到消息队列实战

“后端小白”这个标签,我在自己博客的自我介绍里挂了快一年,直到上个月,我终于用一个周末把一套直播场景的高并发后端环境从零跑通了。说实话,这套环境放到大厂里也就是个玩具,但对于一个平时只写CRUD、连消息队列都没…

2026/9/14 18:00:14

Spring构造注入:原理、优势与最佳实践

1. 为什么构造注入是Spring官方推荐的方式 在Spring框架中,依赖注入(Dependency Injection)是实现控制反转(IoC)的核心机制。Spring提供了三种主要的依赖注入方式:字段注入(Field Injection&…

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/14 0:03:22

KCF目标跟踪算法与OTB工程实现:毕业设计实战解析

简介:这是一份基于KCF核相关滤波算法、融合尺度池与抗遮挡处理的目标检测跟踪MATLAB完整源码,主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初学者。源码在OTB数据集上完成验证,能够…

2026/9/14 0:03:22

语音情感识别实战:Keras实现LSTM、CNN、SVM与MLP多模型对比

简介:面向语音情感识别入门与进阶开发者,这份基于Keras的项目源码完整实现了LSTM、CNN、SVM、MLP四种模型,兼容Python3.8与Keras/TensorFlow2环境。压缩包内含49个文件,大小约70.31MB,主体包括Python脚本、yaml/json配…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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