deque及迭代器失效问题
来源:互联网 发布:cheat engine 6.3 mac 编辑:程序博客网 时间:2024/04/29 17:57
deque由一段一段的定量连续空间构成,采用一个表(map)来记录每个连续空间的首址,map是一小块连续的空间,目的是便于迭代器的寻址(map+1即可跳转到下一个连续空间的首址)。map中的每一个元素(node)都是指针,指向另一端(较大的)连续线性空间,称为缓冲区,缓冲区才是deque的储存空间主体。具体机制如下所示:
其中,对迭代器it的解引用得到的是cur位置处对应的元素。
deque要求map中前后各预留一个node节点,以便扩充时可用。
下面讨论插入删除操作,deque中的迭代器、引用失效问题。
查看deque源码可知,在push_front/push_back中,由于要满足以上预留一个节点的要求,若当前map所管理的节点个数不足以扩充时,map需要重分配。如下图所示:
当前deque中含有23个元素,此时push_back(23),会导致node节点不足,于是引起map的重分配。
原来的迭代器的node指向的map节点被释放,也就无法找到对应的元素,故原迭代器失效。而由于这个过程中内存并未发生改变,故其他元素的引用、指针仍然有效。push_front同理。
pop_front,pop_back只是简单的析构元素,必要时(第一个缓冲区、最后一个缓冲区只有一个元素)释放该缓冲区、调整start、finish迭代器的状态,所以指向其他元素的迭代器、引用均有效。
除了头尾两端,在任何地方插入和删除元素都将导致内存重新分配,导致指向deque元素的任何pointer、iterator、reference失效。
总结如下:
插入
①头尾:
可能指向其他元素的迭代器失效,但指针、引用仍有效
②其他位置:
指向其他元素的迭代器、指针、引用失效
删除
①头尾:
指向其他元素的迭代器、指针、引用仍然有效
②其他位置:
指向其他元素的迭代器、指针、引用失效
- deque及迭代器失效问题
- deque 迭代器失效的问题详解
- STL vector,list,deque删除迭代器失效问题
- deque迭代器失效的困惑?
- STL中,deque插入或删除元素时,迭代器是否失效的问题
- STL迭代器及迭代器失效问题
- STL迭代器及迭代器失效问题
- 迭代器失效问题及迭代器的应用
- STL list的简单实现及list迭代器失效问题
- STL迭代器失效问题
- 迭代器失效问题
- 迭代器失效的问题
- STL迭代器失效问题
- C++迭代器失效问题
- STL迭代器失效问题
- STL迭代器失效问题
- 容器迭代器失效问题
- 迭代器失效问题
- 听东南大学凌明老师讲课的心得总结
- Android LruCache
- NDK开发之获得域和方法描述符
- 2.2.1 Cutaways (about discarding fragments and triangle-face culling) 剪切(关于丢弃片段与三角面剔除)
- R包的安装错误ERROR: dependency ‘plyr’ is not available for package ‘reshape2’
- deque及迭代器失效问题
- 谁是天才(续)
- 黑马程序员----oc基础笔记----类和对象
- 如何在Linux下使用Markdown进行文档工作
- 华为OJ字符串反转
- 黑马程序员--IO流(Properties、打印流 、文件切割与合并)
- PHP之——Boolean类型的判定
- [LeetCode-104] Maximum Depth of Binary Tree(二叉树最大深度)
- 自编数据库连接池应用程序