迭代器是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库打好理论基础!

点赞(1)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)