发布时间:2026/7/29 2:48:56
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/7/29 2:48:56

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

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

2026/7/29 2:43:56

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

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

2026/7/29 2:43:56

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

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

2026/7/29 3:58:59

单体 vs 微服务:LLM 推理服务架构选型与 LLM Twin 实践

一、推理服务的核心挑战:吞吐量与延迟的权衡 在部署大语言模型(LLM)推理服务时,首先需要明确四个关键要求:吞吐量、延迟、数据和基础设施。它们相互制衡,直接影响用户体验。 吞吐量:系统在单位时间内能处理的推理请求数,通常以 RPS(每秒请求数)衡量。高吞吐量需要强…

2026/7/29 3:58:59

C++ UI框架选型指南:从Qt到Dear ImGui的实战解析

1. 项目概述:为什么C开发者需要关注UI框架?在桌面应用、游戏引擎、工业软件乃至嵌入式设备的图形界面开发领域,C一直扮演着基石的角色。很多开发者,尤其是刚入门的C程序员,常常会陷入一个误区:认为C就是用来…

2026/7/29 3:58:59

Python康复训练——控制流与函数

一、控制流 控制流决定代码"走哪条路、走几次"。Python 用缩进对齐来划分代码块&#xff0c;没有大括号&#xff0c;也没有 switch。 1. if 条件判断 # 控制流/if 结构 if score < 60:print(不及格) elif score < 80:print(及格) elif score < 90:print(良好…

2026/7/29 3:58:59

TF02-i-CAN激光雷达快速上手指南:硬件连接、数据解析与配置实战

1. 项目概述&#xff1a;从开箱到通信的快速通道最近在做一个需要中短距离测距的项目&#xff0c;选型时看中了北醒的TF02-i-CAN这款激光雷达模组。东西到手后&#xff0c;第一件事就是让它和电脑“说上话”&#xff0c;把数据读出来。但翻遍资料&#xff0c;发现官方文档虽然详…

2026/7/29 3:53:59

Klipper双Z轴等高校准:解决3D打印第一层不平整的终极方案

1. 项目概述&#xff1a;为什么双Z轴校准是3D打印质量提升的关键一步如果你玩3D打印机有一段时间了&#xff0c;特别是用过一些DIY套件或者自己升级过机器&#xff0c;大概率会遇到一个让人头疼的问题&#xff1a;打印出来的模型&#xff0c;第一层靠近左边和靠近右边的厚度总是…

2026/7/28 13:41:25

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

一、背景与测试方案 在实际项目交付中&#xff0c;PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及&#xff1a;多源PDF的文件流合并、页面级水印渲染&#xff08;含透明度混合与图层叠加&#xff09;、输出文件体积控制。看似简单的操作…

2026/7/29 0:02:56

商标注册找代理还是自己办?算清这笔“时间账”和“风险账

商标注册&#xff0c;找代理还是自己办&#xff1f;帮你算清这笔“时间账”和“风险账”“商标注册&#xff0c;找代理还是自己办&#xff1f;”这是深圳每个创业者都会遇到的灵魂拷问。有人说找代理是花冤枉钱&#xff0c;有人说自己办风险太高。到底哪种更划算&#xff1f;本…

2026/7/29 0:02:56

免费开源RPA工具OpenRPA:企业级自动化流程的终极解决方案

免费开源RPA工具OpenRPA&#xff1a;企业级自动化流程的终极解决方案 【免费下载链接】openrpa Free Open Source Enterprise Grade RPA 项目地址: https://gitcode.com/gh_mirrors/op/openrpa 你是否厌倦了每天重复枯燥的数据录入和报表整理工作&#xff1f;是否希望有…

2026/7/29 0:02:56

KMS智能激活工具:一站式解决Windows和Office激活难题

KMS智能激活工具&#xff1a;一站式解决Windows和Office激活难题 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为系统弹出激活提示而烦恼吗&#xff1f;KMS智能激活工具能够帮你彻底告别W…

2026/7/28 4:38:09

3个高效策略:快速掌握Axure中文界面配置

3个高效策略&#xff1a;快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…