迭代器是STL中连接容器与算法的桥梁,它模拟指针的行为,为不同容器提供统一的元素访问接口。无论底层是数组、链表还是树结构,迭代器都能以相同的方式遍历元素,使得算法可以独立于具体容器实现。这种设计实现了数据存储与操作的彻底分离,是STL泛型编程理念的核心体现。
迭代器根据功能强弱分为五种主要类别,形成层次化的能力体系:
输入迭代器是最基础的类型,支持单向读取操作,适用于一次性遍历场景(如从数据流读取)。
输出迭代器对应地支持单向写入功能。
前向迭代器在输入迭代器基础上增加多遍遍历能力,适用于单链表等结构。
双向迭代器进一步支持前后移动操作,满足双向链表的遍历需求。功能最强大
随机访问迭代器提供完整的指针算术运算,支持跳跃访问和距离计算,向量容器和数组都提供此类迭代器。
下表展示了不同容器及其对应迭代器:
迭代器类别 | 功能描述 | 支持的容器示例 | 关键操作 |
输入迭代器 | 只读、单向、只能遍历一次 | istream_iterator | *it(读取),++it |
输出迭代器 | 只写、单向、只能遍历一次 | ostream_iterator, inserter | *it = value(写入),++it |
前向迭代器 | 可读写、单向、可多次遍历 | forward_list, unordered_set, unordered_map | *it(读写),++it,可重复遍历 |
双向迭代器 | 可读写、可前后移动、可多次遍历 | list, set, map, multiset, multimap | 支持所有前向迭代器操作,增加 --it |
随机访问迭代器 | 完全指针功能,支持随机跳跃 | vector, deque, array, string | 支持所有双向迭代器操作,增加 it + n, it1 - it2, it[n]等 |
冷知识:容器适配器 stack 和 queue 没有迭代器,它们包含有一些成员函数,可以用来对元素进行访问,stack具体通过成员函数top()访问栈顶元素,queue通过成员函数front()访问且只能访问队列第一个元素。
迭代器的定义方式主要有四种:
迭代器类型 | 定义格式 | 功能描述 |
正向迭代器 | 容器类名::iterator 迭代器名; | 可读写,从前向后遍历容器元素 |
常量正向迭代器 | 容器类名::const_iterator 迭代器名; | 只读,从前向后遍历容器元素 |
反向迭代器 | 容器类名::reverse_iterator 迭代器名; | 可读写,从后向前反向遍历容器元素 |
常量反向迭代器 | 容器类名::const_reverse_iterator 迭代器名; | 只读,从后向前反向遍历容器元素 |
重点来了:容器通过迭代器来访问元素
拿vector容器举个例子:
#include<iostream> /*引入vector容器 */ #include<vector> using namespace std; int main(){ /*创建一个vector动态数组容器*/ vector<int> v; /*尾增法填充5个元素*/ for(int i=1;i<6;++i) {v.push_back(i);} /*划重点:访问元素需要通过迭代器访问*/ cout << "通过迭代器遍历v容器:\n" ; for(vector<int>::iterator it = v.begin();it!=v.end();++it) { cout << *it << " "; } cout << '\n'; /*当然,我们的vector重载'[]'符号 也支持'[]'下标访问*/ cout << "通过重载'[]'遍历容器v:\n" ; for(int i=0;i<v.size();++i)cout << v[i]<< " "; cout << '\n'; return 0; }
总结:本节主要介绍了什么是迭代器已经迭代器的详细划分,读者需要理解迭代器这个概念,为后来的深入理解STL库打好理论基础!
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程