C++迭代器是屏蔽容器底层差异、统一遍历操作的抽象指针;支持*、++、==等操作,类型分五级影响算法使用;需防范失效风险,推荐范围for循环与const限定。

C++中的迭代器是一种泛化的指针,用来访问容器中元素的抽象接口。它屏蔽了不同容器(如vector、list、map)底层实现的差异,让遍历操作统一、安全且高效。
迭代器的本质是“可移动的访问位置”
它不一定是真正的指针,而是一类支持*(解引用)、++(前进)、== / !=(比较)等操作的对象。比如:
-
vector本质可能是指针::iterator int*; -
list则是封装了节点指针的类对象,因为链表不支持随机访问;::iterator - 所有标准容器都提供
begin()和end()成员函数,返回对应类型的迭代器。
用迭代器遍历容器的基本写法
最常见的是传统 for 循环或基于范围的 for 循环(C++11起):
- 传统方式:
for (auto it = v.begin(); it != v.end(); ++it) { cout - 更安全推荐:
for (auto& x : v) { cout —— 编译器自动处理迭代器,避免手误(如写成it 对 list 会出错); - 只读场景优先用
const_iterator或auto const&,防止意外修改。
迭代器失效是必须注意的风险
某些操作会让原有迭代器变“无效”,再使用会引发未定义行为:
立即学习“C++免费学习笔记(深入)”;
-
vector在push_back()可能扩容,导致所有迭代器失效; -
erase()后,被删位置及之后的迭代器通常失效(vector、string); -
list和forward_list的erase()只使被删元素的迭代器失效,其余仍有效; - 原则:操作容器后,尽量重新获取迭代器,或使用
erase()返回的新迭代器(如it = c.erase(it))。
迭代器类型影响功能和性能
标准库按能力分五类,容器提供对应等级的迭代器:
-
输入迭代器:只能单向读(如
istream_iterator); -
输出迭代器:只能单向写(如
ostream_iterator); -
前向迭代器:可多次遍历、支持
++(forward_list); -
双向迭代器:支持
++和--(list、set); -
随机访问迭代器:支持
+n、[n]、比较(vector、deque、array)。
算法(如 sort、binary_search)对迭代器类型有明确要求,选错会导致编译失败。
基本上就这些。理解迭代器,关键不是背类型,而是清楚它“怎么用、为什么这么设计、哪里容易踩坑”。









