今天在看STL源码的时候,无意写了如下的代码,发现程序崩溃了:
<span style="font-size:14px;"> deque<int>::iterator iter=d.begin();
d.insert(iter,5);
d.insert(iter,6); //崩溃,迭代器失效了
</span>
之前一直没有留意这个问题,后来结合源码和查找资料,得到如下的结论:
插入操作:
1、在队前或队后插入元素时(push_back(),push_front()),由于可能缓冲区的空间不够,需要增加map中控器,而中控器的个数也不够,所以新开辟更大的空间来容纳中控器,所以可能会使迭代器失效;但指针、引用仍有效,因为缓冲区已有的元素没有重新分配内存。
2、在队列其他位置插入元素时,由于会造成缓冲区的一些元素的移动(源码中执行copy()来移动数据),所以肯定会造成迭代器的失效;并且指针、引用都会失效