0 容器
1 vector
当push_back一个元素后,end()操作返回的迭代器肯定失效。
原因:因为vector的实现是数组,而且即将要插入的位置可能是end(),当扩容的时候,全部失效。
当push_back一个元素后,capacity()的返回值发生变化,也就是说扩容了。那么之前所有的迭代器都是失效。
原因:vector的迭代器实现上就是个指针,而扩容以后原来的元素被拷贝到新的地方,以前的地方内存归还给alloc类了
当erase(),pop_back(),以后,end()迭代器失效,erase删除元素开始后面的元素的迭代器全部失效。
原因:因为删除以后,元素不在有效,因此不应该再使用
2 deque
在deque容器首部或者尾部插入元素不会使得任何迭代器失效。
原因:deque的迭代器实现上不是指针,而是一个单独的类,因此begin(),和end()返回的是一个类,同时,头尾插入元素的时候,迭代器类会自动更新内部的某个字段。而当对迭代器解应用的时候,是直接返回这个字段的。因此不会失效,因为迭代器是实时更新的。
在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效
原因:仍然在于,迭代器是一个单独的类,解引用返回的是内部的指针,因此删除的时候迭代器类的指针自动更新,但是被删除元素的迭代器已经传出,不能自动更新了。所以失效。
在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效
原因:当在中间插入元素的时候,根据插入位置在整个多个数组中的位置关系,将整个数组前移或是后移一个位置。因此之前的迭代器全部失效。
3 List/set/map
删除时,指向该删除节点的迭代器失效
4 stack/queue
这俩货没有迭代器。