C++ STL | STL迭代器(lterator)
目录
- 一、什么是迭代器(Iterator)?
- 二、迭代器的定义与类型别名
- 三、迭代器的基本操作
- 主要操作符
- 四、迭代器的遍历与用法实例
- 1. 基本遍历(推荐用法)
- 2. 反向遍历
- 3. 常量遍历(只读)
- 4. 范围for循环(C++11)
- 5. 通过算法(如sort)
- 五、迭代器的分类及容器支持情况
- 六、注意事项与易错点
- 七、综合示例
- 八、总结
- 九、参考文献
一、什么是迭代器(Iterator)?
迭代器是C++ STL中用于遍历和操作容器元素的一种对象,本质上类似于“普通指针”,用于“指向”容器的元素。
它屏蔽了容器底层的数据结构差异,为各种容器提供了统一的访问接口。
作用:
- 遍历容器中的元素
- 访问、修改容器中的元素
- 作为STL算法(如sort、find等)的桥梁
二、迭代器的定义与类型别名
每种容器都内置有自己的迭代器类型,通常通过如下方式定义:
std::vector<int>::iterator it; // 普通迭代器(可读可写)
std::vector<int>::const_iterator cit; // 常量迭代器(只读)
std::vector<int>::reverse_iterator rit;// 反向迭代器
推荐使用auto自动推导(C++11及以上):
auto it = v.begin();
三、迭代器的基本操作
begin()
: 指向容器第一个元素end()
: 指向容器最后一个元素的下一个位置rbegin()
: 反向迭代器,指向最后一个元素rend()
: 反向迭代器,指向第一个元素的前一个位置cbegin()/cend()
: 常量迭代器
主要操作符
*it
:解引用,访问元素it++ / ++it
:移动到下一个元素it-- / --it
:(双向迭代器及以上)移动到上一个元素it1 == it2
:判断相等
四、迭代器的遍历与用法实例
1. 基本遍历(推荐用法)
std::vector<int> v = {1, 2, 3, 4};
for (auto it = v.begin(); it != v.end(); ++it) {std::cout << *it << " ";
}
2. 反向遍历
for (auto rit = v.rbegin(); rit != v.rend(); ++rit) {std::cout << *rit << " ";
}
3. 常量遍历(只读)
for (auto it = v.cbegin(); it != v.cend(); ++it) {std::cout << *it << " ";
}
4. 范围for循环(C++11)
for (const auto& x : v) {std::cout << x << " ";
}
5. 通过算法(如sort)
std::sort(v.begin(), v.end());
五、迭代器的分类及容器支持情况
迭代器类型 | 支持操作 | 代表容器 |
---|---|---|
输入迭代器 | 只读,单向++ | istream_iterator |
输出迭代器 | 只写,单向++ | ostream_iterator |
前向迭代器 | 读写,单向++ | forward_list, unordered_set/map |
双向迭代器 | 读写,++/– | list, set, map |
随机访问迭代器 | 读写,++/–,+n,-n,[] | vector, deque, array |
连续迭代器(C++17) | 物理内存连续 | vector, array |
说明:
- vector、deque支持随机访问(如v[5]),list、set等不支持。
- unordered_set/map只支持前向迭代器。
- list/set/map支持双向迭代器,可以++也可以–。
六、注意事项与易错点
-
迭代器失效问题
- vector/deque插入、删除元素时,原有迭代器可能失效(指向无效内存)。
- list插入不会使其它迭代器失效,删除只影响被删元素的迭代器。
- set/map插入不会失效,删除只影响被删元素的迭代器。
-
不同容器的迭代器不可混用
- 例如不能用vector的迭代器操作list的元素。
-
常量迭代器不能修改元素
const_iterator
只能读取,不能通过*it
修改元素值。
-
STL算法与迭代器配合
- 大部分STL算法(如sort、find、reverse)都通过迭代器操作,需传入起止迭代器。
七、综合示例
#include <vector>
#include <iostream>
#include <algorithm>int main() {std::vector<int> v = {3, 1, 4, 2};// 排序std::sort(v.begin(), v.end());// 正向遍历for(auto it = v.begin(); it != v.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 反向遍历for(auto rit = v.rbegin(); rit != v.rend(); ++rit) {std::cout << *rit << " ";}std::cout << std::endl;// 范围forfor(const auto& x : v) {std::cout << x << " ";}std::cout << std::endl;// 查找auto pos = std::find(v.begin(), v.end(), 2);if (pos != v.end()) std::cout << "Found: " << *pos << std::endl;return 0;
}
八、总结
- 迭代器是贯穿C++ STL的核心工具,屏蔽了底层容器差异,统一了元素遍历方式。
- 掌握迭代器分类、用法、失效机制,有助于写出健壮、高效、通用的C++代码。
- 推荐使用auto和范围for提高代码简洁性和可读性。
九、参考文献
- C++ STL迭代器(iterator)用法详解 - C语言中文网
- C++ STL迭代器的用法(附带实例) - C语言中文网
- C++迭代器(STL迭代器)iterator详解 - C语言中文网