news 2026/6/10 12:49:54

迭代器的初认识

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
迭代器的初认识

迭代器(Iterator)是 C++ STL 的核心组件之一,本质是封装了指针行为的对象,为不同容器提供统一的遍历接口—— 无论底层是数组(vector)、链表(list)、红黑树(map)还是哈希表(unordered_map),都能通过迭代器以相同的方式访问元素,实现了 “算法与容器解耦”。

一、迭代器的核心定位

迭代器的作用是连接容器和算法

  • 容器提供数据存储,算法提供通用操作(排序、查找等);
  • 迭代器作为 “桥梁”,让算法无需关心容器的底层实现,只需通过迭代器访问元素。

可以把迭代器理解为 “通用版的指针”:支持*(解引用)、++(移动)、==/!=(比较)等指针操作,但适配了不同容器的内存结构。

二、迭代器的基本特性

特性说明
遍历方向单向(如forward_iterator)、双向(如list的迭代器)、随机访问(如vector的迭代器)
读写权限普通迭代器(可读可写)、常量迭代器(const_iterator,只读)
遍历范围遵循 “左闭右开” 原则:begin()指向第一个元素,指向最后一个元素的下一个位置(不指向有效元素)

三、迭代器的分类(按功能强弱)

STL 迭代器按功能从弱到强分为 5 类,不同容器支持的迭代器类型不同:

迭代器类型核心能力支持的操作适用容器
输入迭代器(Input)只读,单向向前移动*itit++==/!=istream_iterator
输出迭代器(Output)只写,单向向前移动*it = valit++ostream_iterator
前向迭代器(Forward)可读可写,单向向前移动输入 + 输出迭代器的所有操作forward_listunordered_set
双向迭代器(Bidirectional)可读可写,双向移动(++/--)前向迭代器 +it--listmapset
随机访问迭代器(Random Access)可读可写,随机访问(+/-/[])双向迭代器 +it+n/it-n/it[]vectordequearray

四、迭代器的基本用法(以vector为例)

1. 定义与初始化

cpp

运行

#include <iostream> #include <vector> using namespace std; int main() { vector<int> v = {10, 20, 30, 40, 50}; // 1. 普通迭代器(可读可写) vector<int>::iterator it; it = v.begin(); // 指向第一个元素(10) // 2. 常量迭代器(只读,不可修改元素) vector<int>::const_iterator cit = v.cbegin(); // cbegin() 返回const_iterator // 3. 反向迭代器(从尾到头遍历) vector<int>::reverse_iterator rit = v.rbegin(); // 指向最后一个元素(50) return 0; }
2. 遍历容器(核心场景)

cpp

运行

int main() { vector<int> v = {10, 20, 30, 40, 50}; // 方式1:普通迭代器遍历(左闭右开) cout << "普通迭代器遍历:"; for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; // 解引用获取元素值 } cout << endl; // 输出:10 20 30 40 50 // 方式2:常量迭代器遍历(只读) cout << "常量迭代器遍历:"; for (vector<int>::const_iterator cit = v.cbegin(); cit != v.cend(); cit++) { cout << *cit << " "; // *cit = 100; // 错误:常量迭代器不可修改元素 } cout << endl; // 方式3:反向迭代器遍历(从尾到头) cout << "反向迭代器遍历:"; for (vector<int>::reverse_iterator rit = v.rbegin(); rit != v.rend(); rit++) { cout << *rit << " "; } cout << endl; // 输出:50 40 30 20 10 return 0; }
3. 修改元素(普通迭代器)

cpp

运行

int main() { vector<int> v = {10, 20, 30}; vector<int>::iterator it = v.begin(); *it = 100; // 修改第一个元素为100 it++; // 迭代器后移,指向第二个元素 *it += 50; // 第二个元素变为20+50=70 // 遍历验证:100 70 30 for (auto x : v) cout << x << " "; return 0; }

四、不同容器的迭代器差异(重点)

不同容器的底层结构不同,导致迭代器的功能和性能差异显著:

容器迭代器类型核心限制
vector随机访问迭代器支持it+nit[],遍历 / 随机访问快
list双向迭代器不支持it+n/it[],只能++/--
map/set双向迭代器元素只读(修改需先删除再插入)
unordered_map前向迭代器不支持--,遍历顺序无序
array随机访问迭代器固定大小,迭代器不可越界

示例(list的迭代器限制):

cpp

运行

#include <list> int main() { list<int> lst = {1,2,3}; list<int>::iterator it = lst.begin(); it++; // 合法:双向迭代器支持++ it--; // 合法:支持-- // it += 2; // 错误:list迭代器不支持随机访问 // cout << it[0]; // 错误:无[]操作 return 0; }

五、迭代器的常用技巧

1. 自动类型推导(auto简化代码)

C++11 后可通过auto自动推导迭代器类型,避免冗长的类型声明:

cpp

运行

vector<string> months = {"Jan", "Feb", "Mar"}; // auto 推导为 vector<string>::iterator for (auto it = months.begin(); it != months.end(); it++) { cout << *it << " "; }
2. 迭代器与算法结合(STL 核心用法)

算法通过迭代器操作容器,无需关心容器类型:

cpp

运行

#include <algorithm> // sort/find 头文件 int main() { vector<int> v = {3,1,4,1,5}; // 排序:通过迭代器指定范围 sort(v.begin(), v.end()); // v变为{1,1,3,4,5} // 查找:返回指向目标元素的迭代器 auto it = find(v.begin(), v.end(), 3); if (it != v.end()) { cout << "找到元素:" << *it << endl; // 输出:找到元素:3 } return 0; }
3. 迭代器失效问题(避坑重点)

修改容器(插入 / 删除元素)可能导致迭代器失效(指向非法内存),需注意:

  • vector:插入 / 删除元素可能导致内存重分配,迭代器失效;
  • list:插入元素不失效,删除元素仅失效指向被删元素的迭代器;
  • map:插入 / 删除元素仅失效指向被删元素的迭代器。

示例(vector迭代器失效修复):

cpp

运行

vector<int> v = {1,2,3,4}; // 错误:删除元素后,it 失效,++it 会崩溃 // for (auto it = v.begin(); it != v.end(); it++) { // if (*it == 2) v.erase(it); // } // 正确:用 erase 返回的新迭代器更新 for (auto it = v.begin(); it != v.end();) { if (*it == 2) { it = v.erase(it); // erase 返回下一个有效迭代器 } else { it++; } }

六、迭代器的核心优势

  1. 接口统一:不同容器的遍历方式一致,算法可复用(如sort可排序vector,也可排序array);
  2. 类型安全:编译期检查迭代器类型,避免原生指针的越界风险;
  3. 解耦设计:算法与容器分离,新增容器只需实现迭代器,无需修改算法;
  4. 功能扩展:支持反向迭代器、常量迭代器等,适配不同场景需求。

总结

迭代器是 STL 的 “灵魂”,核心是为不同容器提供统一的访问接口。掌握迭代器的关键:

  1. 理解 “左闭右开” 的遍历范围;
  2. 区分不同容器的迭代器类型(尤其是随机访问 vs 双向 / 前向);
  3. 规避迭代器失效问题;
  4. 结合auto和算法简化代码。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 19:05:23

GPT-5.2 正式发布!开发者需要关注的 4 个核心变化

OpenAI 毫无预警地发布了 GPT-5.2&#xff0c;直接回应了前段时间 Gemini 3 和 Claude 4.5 的围剿。这一次更新不仅是参数量的提升&#xff0c;更是架构逻辑的质变。本文综合了多篇首发技术测评&#xff0c;带你快速看懂 GPT-5.2 的“双模式”架构、100% 的数学满分表现以及对我…

作者头像 李华
网站建设 2026/6/10 14:52:52

终极指南:如何使用SpinningMomo提升《无限暖暖》摄影体验

终极指南&#xff1a;如何使用SpinningMomo提升《无限暖暖》摄影体验 【免费下载链接】SpinningMomo 一个为《无限暖暖》提升游戏摄影体验的窗口调整工具。 A window adjustment tool for Infinity Nikki that enhances in-game photography. 项目地址: https://gitcode.com/…

作者头像 李华
网站建设 2026/6/10 2:13:31

企业AI智能体的落地挑战与最优实践:技术选型、架构设计及效能优化

一、企业AI智能体落地的三大核心挑战在数字化转型浪潮下&#xff0c;企业部署AI智能体时普遍面临以下技术痛点&#xff1a;1. 数据孤岛与知识碎片化典型表现&#xff1a;企业内部存在ERP、CRM、生产系统等多套异构数据库&#xff0c;非结构化文档&#xff08;如技术手册、合同文…

作者头像 李华
网站建设 2026/6/10 14:52:19

FFXIV快速启动器完整使用指南:从安装到高级配置

FFXIV快速启动器完整使用指南&#xff1a;从安装到高级配置 【免费下载链接】FFXIVQuickLauncher Custom launcher for FFXIV 项目地址: https://gitcode.com/GitHub_Trending/ff/FFXIVQuickLauncher XIVLauncher&#xff08;简称XL&#xff09;是专为《最终幻想14》游戏…

作者头像 李华
网站建设 2026/6/10 15:42:47

3步掌握Qwen-Image调优技巧:小白也能快速上手的终极指南

3步掌握Qwen-Image调优技巧&#xff1a;小白也能快速上手的终极指南 【免费下载链接】Qwen-Image 我们隆重推出 Qwen-Image&#xff0c;这是通义千问系列中的图像生成基础模型&#xff0c;在复杂文本渲染和精准图像编辑方面取得重大突破。 项目地址: https://ai.gitcode.com/…

作者头像 李华
网站建设 2026/6/10 0:40:18

Lively动态壁纸平台:解锁桌面美化的无限可能

还在为单调的桌面背景感到乏味吗&#xff1f;想要让电脑屏幕焕发新生机&#xff1f;Lively Wallpaper作为一款基于WinUI 3的开源动态壁纸引擎&#xff0c;其内置的主题分享平台正为你打开一扇通往创意世界的大门。本文将带你深入了解如何玩转这一功能&#xff0c;从新手入门到高…

作者头像 李华