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失效。

总结如下

插入

①头尾:

可能指向其他元素的迭代器失效,但指针、引用仍有效

②其他位置:

指向其他元素的迭代器、指针、引用失效

删除

①头尾:

指向其他元素的迭代器、指针、引用仍然有效

②其他位置:

指向其他元素的迭代器、指针、引用失效



0 0