行为像指针一样的类型,用户不用关注容器底层细节,而可以轻松访问容器。底层可能是指针,也可能是被类封装的指针。每种容器都有自己专属的迭代器。
迭代器是 算法 和 容器之间的桥梁
如果没有迭代器:
访问需要暴露容器底层结构及实现细节,容器的封装性就别谈了
使用者门槛较高,比如要访问 map,需要掌握二叉树的遍历
所以我们可以说,迭代器:
失效举例:
vector
insert 扩容,会导致野指针
insert 不扩容,但是挪动数据,指向位置已经不是原来的位置
erase 数据以后,挪动数据,指向位置已经不是原来的位置
list
erase 数据以后,节点删除,导致野指针
map/set/unordered_xxx
erase 数据以后,节点删除,导致野指针

单向:支持 ++
forward_list、unordered_xxx
双向:支持 ++/--
map/set、list
随机:支持 ++/--、+/ -、[]…
string、vector、deque
某些算法对传入容器的迭代器有要求,从命名上就能看出:

sort 支持随机

reverse 支持双向、随机

find 支持单项、双向、随机