码迷,mamicode.com
首页 > 编程语言 > 详细

c++ 标准库迭代器失效

时间:2018-03-15 22:15:57      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:ring   中间   push   bitset   节点   单向链表   sdn   没有   end   

0 容器

标准STL序列容器:vector、string、deque和list。
标准STL关联容器:set、multiset、map和multimap。
非标准序列容器slist和rope。slist是一个单向链表,rope本质上是一个重型字符串
非标准关联容器hash_set、hash_multiset、hash_map和hash_multimap。
几种标准非STL容器,包括数组、bitset、valarray、stack、queue和priority_queue
 

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

这俩货没有迭代器。

c++ 标准库迭代器失效

标签:ring   中间   push   bitset   节点   单向链表   sdn   没有   end   

原文地址:https://www.cnblogs.com/perfy576/p/8576347.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!