一、什么是迭代器
迭代器本质:容器的通用智能指针作用:
- 统一所有容器遍历方式
- 不用关心底层是数组、链表、哈希表
- 配合 STL 算法直接使用
通俗理解:指针只能访问内存;迭代器可以遍历任意 STL 容器。
二、迭代器基础语法
定义格式:
容器类型::iterator 迭代器名;
示例:vector 迭代器
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v = {10,20,30,40};
// 定义迭代器
vector<int>::iterator it;
// begin() 指向第一个元素
// end() 指向最后一个元素的下一个位置
for(it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
return 0;
}
输出:
10 20 30 40
三、迭代器核心端点
begin():返回首元素迭代器end():返回末尾后一位迭代器 ,不代表有效元素遍历判断标准:it != v.end() 不要用 <=
四、迭代器四种分类
-
普通迭代器 iterator可读可写,可修改容器元素
vector<int>::iterator it;
*it = 100; -
常量迭代器 const_iterator只能读、不能修改,保护数据
vector<int>::const_iterator it;
// *it = 100; 报错 -
反向迭代器 reverse_iterator从后往前遍历
cpp
运行
vector<int>::reverse_iterator it;
for(it = v.rbegin(); it != v.rend(); ++it)
{
cout << *it << " ";
}
- 只读反向迭代器遍历只读、逆序,日常用得少。
五、迭代器常用操作
it++ // 往后移动一位
it-- // 往前移动一位
*it // 取迭代器指向元素
it-> // 访问结构体/类对象成员
六、string 也能用迭代器
string 本质也是容器,同样支持:
string s = "hello";
for(string::iterator it = s.begin(); it != s.end(); ++it)
{
cout << *it;
}
七、C++11 范围 for 底层原理
for(int x : v)
{
cout << x;
}
底层本质就是迭代器遍历,只是语法简化。
八、新手易错点
- 把
end()当成最后一个有效元素 - 迭代器遍历中随意增删元素,导致迭代器失效
- const 迭代器试图修改元素
- 逆序迭代器分不清 rbegin /rend
九、今日总结
- 迭代器是 STL 通用遍历标准,相当于容器专用指针
- 核心成员:
begin()首位置、end()尾后位置 - 常用四种:普通、常量、反向、常量反向
- 所有 STL 容器都支持迭代器,学会一个通吃所有
- 范围 for 底层依赖迭代器