STL迭代器是访问容器元素的统一接口,本质为重载指针操作符的类对象,解耦算法与容器,使sort、find等算法不依赖具体容器类型;通过begin()/end()获取,end()指向末尾后一位置。

STL迭代器是访问容器元素的统一接口,本质是一个类对象,行为类似指针——能解引用(*)、自增(++)、比较(==/!=),但屏蔽了底层存储细节。它把“怎么存”和“怎么用”分开,让算法(如sort、find)不依赖具体容器类型。
迭代器的核心作用:解耦算法与容器
不同容器内存布局不同(vector连续,list链式,map红黑树),但只要提供符合要求的迭代器,同一个for_each就能遍历它们。标准库算法只认迭代器操作,不管背后是数组还是节点指针。
- 迭代器不是原生指针,但重载了指针常用操作符,用法高度相似
- 每种容器定义自己的迭代器类型(如
vector),通常通过::iterator begin()/end()获取 -
end()返回的是“末尾后一位置”的迭代器,不指向有效元素,仅作循环边界
常用遍历方式(以vector为例)
假设vector
-
传统for + 迭代器:
for (auto it = v.begin(); it != v.end(); ++it) { cout -
范围for循环(推荐):
for (const auto& x : v) { cout —— 编译器自动用迭代器实现,更简洁安全 -
算法遍历:
for_each(v.begin(), v.end(), [](int x) { cout
迭代器类型与有效性注意点
迭代器按功能分五类(输入、输出、前向、双向、随机访问),vector支持随机访问(可it += 2),list只支持双向(只能++/--)。
立即学习“C++免费学习笔记(深入)”;
- 容器修改可能使原有迭代器失效:如
vector扩容时所有迭代器失效;erase后被删位置及之后的迭代器失效 - 避免
it = v.erase(it)之外的++it写法,尤其在循环中删除元素时 - 用
cbegin()/cend()获取const迭代器,确保只读访问
快速判断某容器是否支持某种操作
查文档看其迭代器类别,或用std::is_same_v检测(编译期):
-
std::is_same_v返回::iterator::iterator_category, std::random_access_iterator_tag> true -
std::is_same_v返回::iterator::iterator_category, std::bidirectional_iterator_tag> true
不复杂但容易忽略。











