STL顺序容器(3)——顺序容器失效的几种情况

版权声明:小能 https://blog.csdn.net/qq_43152052/article/details/89262018

向容器添加元素或者从容器中删除元素操作可能导致使指向容器的指针、引用或迭代器失效
一个失效的指针、引用或迭代器将不再表示任何元素。使用失效的指针、引用或迭代器是一种错误的方式,可能引起与未初始化指针一样的问题

向容器中添加元素后:

1、容器是vector或string,若存储空间被重新分配,指向容器的指针、引用或迭代器失效
存储空间没有重新分配,插入位置之前的指向容器的指针、引用或迭代器有效,插入位置之后的无效。
2、对于deque,插入到首尾元素之外的任何位置导致指向容器的指针、引用或迭代器失效。在首元位置添加元素,迭代器会失效,但是指向存在元素的引用和指针不会失效。
3、对于list和forward_list,指向容器的指针、引用或迭代器(包括尾后迭代器和首前迭代器)依然有效。

在容器中删除一个元素后:

1、对于list和forward_list,在删除一个元素后,指向容器其他位置的迭代器(包括尾后迭代器和首前迭代器)、引用和指针任有效。
2、对于deque,首尾之外的任何位置删除元素,指向删除元素外其他元素的迭代器、引用或指针也会失效。删除deque的尾元素,除了尾后迭代器会失效外,其他迭代器、引用和指针都不受影响。如果删除首元素,这些也不会受影响。
3、对于vector和string,指向被删元素之前元素的迭代器、引用和指针任有效
注意:
当我们删除元素时,尾后迭代器总有效。使用失效的迭代器、指针或引用是严重的运行时错误。
嘻嘻
编写改变容器的循环程序:
添加|删除vector、string或deque元素的循环程序必须考虑迭代器、引用和指针可能失效的问题。
不要保存end返回的迭代器:
在一个循环中插入|删除deque、string或vector中的元素,不要在循环前缓存end返回的迭代器,原因是原来end返回的迭代器总是会失效。解决方法:每次使用end()操作来获取尾后迭代器。

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/89262018