C++迭代器失效问题

以下这段话来自《C++标准程序库》—第六章STL容器
“vector迭代器失效发生在下列两种情况
(1)使用者在一个较小索引位置上安插和移除操作
(2)由于容量变化而引起内存分配”
要深刻理解这段话并不容易—-
其实这里迭代器失效的两种情况代表了两种不同的失效含义:
1.当在vector中的某一位置安插(v.insert())或移除(v.erase())某个元素时,且当安插操作时,容器还有一定的容量(v.capacity())来容纳这个元素。如此一来,安插和移除操作不会因容器满而重新分配内存。在安插和移除操作后,作用点位置前的元素并没改变,而操作位置后的元素向后或向前移动一位。因此作用点后的各元素迭代器失效。注意此处的失效只是与安插或移位前定义的迭代器的意图出现稍微偏差。例如安插之前定义了一个逆向迭代器,安插后便无法通过该迭代器遍历所有元素(会丢掉一个元素}。
2.首先,我们知道vector实际上是连续存储的动态数组,因此当容器满时,为了保证连续存储需要重新开辟空间并将其原有数组拷贝到新空间,这使得原来空间的迭代器全部失效。此处的失效会在调试时出现debug assertion failed错误,这是由访问一个野指针而引起。注意vector为其分配内存的机制为:每次当容器满而重新分配内存时,都会分配比所需内存多的空间,因此,大多数安插和移除元素并不会发生内存的重新分配。这在一定程度上优化了vector的效率,避免了每次插入都进行内存重新分配这一耗时的操作。但是,尽管如此,我们也应坚决杜绝使用安插操作前定义的迭代器。

转载自 https://blog.csdn.net/Gouhailiang/article/details/74279285

你可能感兴趣的:(C++迭代器失效问题)