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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • STL部分 1.STL为什么广泛被使用 C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vec...
    杰伦哎呦哎呦阅读 4,346评论 0 9
  • 容器 在实际的开发过程中, 数据结构本身的重要性不会逊于操作于数据结构的算法的重要性, 当程序中存在着对时间要求很...
    编程小兔崽阅读 1,116评论 0 1
  • #1.顺序容器概述 #2.容器库概览迭代器容器类型成员begin和end成员容器定义和初始化赋值和swap容器大小...
    MrDecoder阅读 1,236评论 0 1
  • 顺序容器概述 C++标准库中的顺序容器为程序员提供了控制元素存储和顺序访问元素的能力,包括vector,strin...
    土豆吞噬者阅读 632评论 0 0
  • 容器的概念所谓STL容器,即是将最常运用的一些数据结构(data structures)实现出来。容器是指容纳特定...
    饭饭H阅读 391评论 0 0