岗顶网站开发,好的网站设计,连云港网络公司排名,怎么自己编写网站迭代器#xff08;Iterator#xff09;是 C STL 的核心组件之一#xff0c;本质是封装了指针行为的对象#xff0c;为不同容器提供统一的遍历接口—— 无论底层是数组#xff08;vector#xff09;、链表#xff08;list#xff09;、红黑树#xff08;map#xff09…迭代器Iterator是 C STL 的核心组件之一本质是封装了指针行为的对象为不同容器提供统一的遍历接口—— 无论底层是数组vector、链表list、红黑树map还是哈希表unordered_map都能通过迭代器以相同的方式访问元素实现了 “算法与容器解耦”。一、迭代器的核心定位迭代器的作用是连接容器和算法容器提供数据存储算法提供通用操作排序、查找等迭代器作为 “桥梁”让算法无需关心容器的底层实现只需通过迭代器访问元素。可以把迭代器理解为 “通用版的指针”支持*解引用、移动、/!比较等指针操作但适配了不同容器的内存结构。二、迭代器的基本特性特性说明遍历方向单向如forward_iterator、双向如list的迭代器、随机访问如vector的迭代器读写权限普通迭代器可读可写、常量迭代器const_iterator只读遍历范围遵循 “左闭右开” 原则begin()指向第一个元素就指向最后一个元素的下一个位置不指向有效元素三、迭代器的分类按功能强弱STL 迭代器按功能从弱到强分为 5 类不同容器支持的迭代器类型不同迭代器类型核心能力支持的操作适用容器输入迭代器Input只读单向向前移动*it、it、/!istream_iterator输出迭代器Output只写单向向前移动*it val、itostream_iterator前向迭代器Forward可读可写单向向前移动输入 输出迭代器的所有操作forward_list、unordered_set双向迭代器Bidirectional可读可写双向移动/--前向迭代器 it--list、map、set随机访问迭代器Random Access可读可写随机访问/-/[]双向迭代器 itn/it-n/it[]vector、deque、array四、迭代器的基本用法以vector为例1. 定义与初始化cpp运行#include iostream #include vector using namespace std; int main() { vectorint v {10, 20, 30, 40, 50}; // 1. 普通迭代器可读可写 vectorint::iterator it; it v.begin(); // 指向第一个元素10 // 2. 常量迭代器只读不可修改元素 vectorint::const_iterator cit v.cbegin(); // cbegin() 返回const_iterator // 3. 反向迭代器从尾到头遍历 vectorint::reverse_iterator rit v.rbegin(); // 指向最后一个元素50 return 0; }2. 遍历容器核心场景cpp运行int main() { vectorint v {10, 20, 30, 40, 50}; // 方式1普通迭代器遍历左闭右开 cout 普通迭代器遍历; for (vectorint::iterator it v.begin(); it ! v.end(); it) { cout *it ; // 解引用获取元素值 } cout endl; // 输出10 20 30 40 50 // 方式2常量迭代器遍历只读 cout 常量迭代器遍历; for (vectorint::const_iterator cit v.cbegin(); cit ! v.cend(); cit) { cout *cit ; // *cit 100; // 错误常量迭代器不可修改元素 } cout endl; // 方式3反向迭代器遍历从尾到头 cout 反向迭代器遍历; for (vectorint::reverse_iterator rit v.rbegin(); rit ! v.rend(); rit) { cout *rit ; } cout endl; // 输出50 40 30 20 10 return 0; }3. 修改元素普通迭代器cpp运行int main() { vectorint v {10, 20, 30}; vectorint::iterator it v.begin(); *it 100; // 修改第一个元素为100 it; // 迭代器后移指向第二个元素 *it 50; // 第二个元素变为205070 // 遍历验证100 70 30 for (auto x : v) cout x ; return 0; }四、不同容器的迭代器差异重点不同容器的底层结构不同导致迭代器的功能和性能差异显著容器迭代器类型核心限制vector随机访问迭代器支持itn、it[]遍历 / 随机访问快list双向迭代器不支持itn/it[]只能/--map/set双向迭代器元素只读修改需先删除再插入unordered_map前向迭代器不支持--遍历顺序无序array随机访问迭代器固定大小迭代器不可越界示例list的迭代器限制cpp运行#include list int main() { listint lst {1,2,3}; listint::iterator it lst.begin(); it; // 合法双向迭代器支持 it--; // 合法支持-- // it 2; // 错误list迭代器不支持随机访问 // cout it[0]; // 错误无[]操作 return 0; }五、迭代器的常用技巧1. 自动类型推导auto简化代码C11 后可通过auto自动推导迭代器类型避免冗长的类型声明cpp运行vectorstring months {Jan, Feb, Mar}; // auto 推导为 vectorstring::iterator for (auto it months.begin(); it ! months.end(); it) { cout *it ; }2. 迭代器与算法结合STL 核心用法算法通过迭代器操作容器无需关心容器类型cpp运行#include algorithm // sort/find 头文件 int main() { vectorint 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运行vectorint 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; } }六、迭代器的核心优势接口统一不同容器的遍历方式一致算法可复用如sort可排序vector也可排序array类型安全编译期检查迭代器类型避免原生指针的越界风险解耦设计算法与容器分离新增容器只需实现迭代器无需修改算法功能扩展支持反向迭代器、常量迭代器等适配不同场景需求。总结迭代器是 STL 的 “灵魂”核心是为不同容器提供统一的访问接口。掌握迭代器的关键理解 “左闭右开” 的遍历范围区分不同容器的迭代器类型尤其是随机访问 vs 双向 / 前向规避迭代器失效问题结合auto和算法简化代码。