deque及迭代器失效问题

本文深入探讨deque数据结构的内存管理机制,解释了在进行插入和删除操作时如何影响迭代器的有效性。重点讨论了deque内部使用map与node节点的原理,以及在push_front和push_back操作时如何触发map重分配,导致原有迭代器失效的情况。同时,文章区分了头尾元素与中间元素操作对迭代器的影响,并提供了相关代码示例以辅助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

总结如下

插入

①头尾:

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

②其他位置:

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

删除

①头尾:

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

②其他位置:

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值