设为首页 加入收藏

TOP

C++迭代器失效的问题汇总(一)
2014-07-19 23:03:26 来源: 作者: 【 】 浏览:115
Tags:失效 问题 汇总

  首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器失效。那为什么迭代器会失效呢?vector元素在内存中是顺序存储,试想:如果当前容器中已经存在了10个元素,现在又要添加一个元素到容器中,但是内存中紧跟在这10个元素后面没有一个空闲空间,而vector的元素必须顺序存储一边索引访问,所以我们不能在内存中随便找个地方存储这个元素。于是vector必须重新分配存储空间,用来存放原来的元素以及新添加的元素:存放在旧存储空间的元素被复制到新的存储空间里,接着插入新的元素,最后撤销旧的存储空间。这种情况发生,一定会导致vector容器的所有迭代器都失效。我们看到实现上述所说的分配和撤销内存空间的方式以实现vector的自增长性,效率是极其低下的。为了使vector容器实现快速的内存分配,实际分配的容器会比当前所需的空间多一些,vector容器预留了这些额外的存储区,用来存放新添加的元素,而不需要每次都重新分配新的存储空间。你可以从vector里实现capacity和reserve成员可以看出这种机制。capacity和size的区别:size是容器当前拥有的元素个数,而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。

  vector迭代器的失效情况:

  1.当插入(push_back)一个元素后,end操作返回的迭代器肯定失效。

  2.当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时begin和end操作返回的迭代器都会失效。

  3.当进行删除操作(erase,pop_back)后,指向删除点的迭代器全部失效;指向删除点后面的元素的迭代器也将全部失效。

  deque迭代器的失效情况:

  1.在deque容器首部或者尾部插入元素不会使得任何迭代器失效。

  2.在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效。

  3.在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效。

  List/set/map迭代器的失效情况:

  删除时,指向该删除节点的迭代器失效

  list intList;

  list::iterator it = intList.begin();

  while(it != intList.end())

  {

  it = intList.erase(it);

  ……

  }

  总结各种容器特点

  (1) vector

  内部数据结构:数组。

  随机访问每个元素,所需要的时间为常量。

  在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。

  可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存。

  vector的迭代器在内存重新分配时将失效(它所指向的元素在该操作的前后不再相同)。当把超过capacity()-size()个元素插入vector中时,内存会重新分配,所有的迭代器都将失效;否则,指向当前元素以后的任何元素的迭代器都将失效。当删除元素时,指向被删除元素以后的任何元素的迭代器都将失效。

  (2)deque

  内部数据结构:数组。

  随机访问每个元素,所需要的时间为常量。

  在开头和末尾增加元素所需时间与元素数目无关,在中间增加或删除元素所需时间随元素数目呈线性变化。

  可动态增加或减少元素,内存管理自动完成,不提供用于内存管理的成员函数。

  增加任何元素都将使deque的迭代器失效。在deque的中间删除元素将使迭代器失效。在deque的头或尾删除元素时,只有指向该元素的迭代器失效。

  (3)list

  内部数据结构:双向环状链表。

  不能随机访问一个元素。

  可双向遍历。

  在开头、末尾和中间任何地方增加或删除元素所需时间都为常量。

  可动态增加或减少元素,内存管理自动完成。

  增加任何元素都不会使迭代器失效。删除元素时,除了指向当前被删除元素的迭代器外,其它迭代器都不会失效。

     

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++ Primer的10.3.9单词转换 下一篇类似Common Lisp的多参数加法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·CPython是什么?PyPy (2025-12-26 06:50:09)
·Python|如何安装seab (2025-12-26 06:50:06)
·python要学习数据分 (2025-12-26 06:50:03)
·每日一道面试题-多线 (2025-12-26 06:20:17)
·java项目中哪些地方 (2025-12-26 06:20:14)