什么是迭代器
迭代器(Iterator)是一个在容器中访问元素的对象,提供了一种方法来顺序访问容器中的元素,而无需暴露容器的底层表示。
或者说 行为像指针一样的类型。可能是指针也可能是被类封装的指针,不关注容器底层细节访问容器。
迭代器在STL的地位
迭代器的价值是什么
是STL其他五个组件的粘合剂
迭代器使得编写一些通用算法成为可能,这些算法可以作用于不同类型的容器而无需改变代码。
什么是迭代器失效
迭代器失效,顾名思义,就是迭代器无效的情况。如果一个迭代器无法正确引用一个元素(比如元素已经被删除)或者迭代器的行为无法预知(如在迭代的过程中容器发生改变),我们就说这个迭代器已经失效。
迭代器失效的情况和主要原因:
- 容器元素被删除。如果一个元素被删除,指向该元素的迭代器,引用和指针都会失效。
-
非序列容器(如 map, set)的元素被修改。对于非序列容器,元素的值(key)是关键的部分,改变元素的值可能会改变元素在容器中的位置,这会使得指向该元素的迭代器失效。
-
容器的内存空间被重新分配。对于某些需要连续内存空间的容器(如 vector, deque, string),如果在容器中添加元素使得容器容量不足而进行重新分配,原来的迭代器就会失效。而对于 list 和 forward_list 这样的链表结构,添加或删除元素只会影响到指向这个元素的迭代器,其他的迭代器不会失效。
=========================================================================
反向迭代器的原理
反向迭代器(Reverse Iterators)是一种特殊的迭代器,它将内部容器的迭代顺序反向,使得原本从前往后的顺序变为从后往前。
原理:
反向迭代器的工作原理是通过对原始迭代器进行包装,改变其 ++
、--
、*
等操作的语义。我们可以用 rbegin()
获取一个反向迭代器,这个迭代器指向容器的最后一个元素,然后通过 ++
运算符可以使其向前移动,而不是向后。
迭代器分类
单向++ (Forward iterators)
forword_list 和unordered_map / unordered_set 都是单向迭代器
双向 ++ / -- (Bidirectional iterators)
map / set 和list 都是双向迭代器
随机迭代器 ++ / -- / + / - (Random-access iterators)
string vector deque 都是随机迭代器
迭代器分类的目的是为了提供不同层次的接口访问容器中的元素,这样设计使得算法可以基于迭代器的类别进行适配,实现更高的灵活性和通用性。例如,一些算法仅需要输入迭代器,而更复杂的算法可能需要随机访问迭代器。按照迭代器的分类实现算法,可以保证算法可以在满足要求的最宽泛范围的容器上工作。