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&,防止意外修改。某些操作会让原有迭代器变“无效”,再使用会引发未定义行为:
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)对迭代器类型有明确要求,选错会导致编译失败。
基本上就这些。理解迭代器,关键不是背类型,而是清楚它“怎么用、为什么这么设计、哪里容易踩坑”。