释放空间的操作

来源:2-7 避免复杂度的震荡

易萧

2017-07-21

为啥resize操作会把data[size]这个元素抹掉。data[size]不是正好在释放空间后原来capacity/2的最后一个元素么。

还有对于后面capacity/4的时候才折半释放,这时候data[size]也应该完全不用提前备份了,它就是存在新的数组中的。

写回答

2回答

liuyubobobo

2017-07-22

我觉得我没有特别理解你的问题,如果下面的陈述没有回答你的问题,请补充的你问题。。。


resize的过程中,新开辟了一片空间,这片空间和原来data指针中指向的空间一点关系都没有。所以需要将原来空间里的数据挪到新的空间中,再将原来的空间释放掉。将data指针指向新的空间。所以,这个过程是不存在抹去什么数据,或者什么数据还在哪里,是两片空间之间数据的转移。

2
0

延鹏飞

2017-07-21

删除元素后,容量为一半的时候,再进行resize操作。也就是删除第11个元素的时候,需要把第11个元素保存起来,然后resize成容量为10的,size变为11-1,capacity变为20/2。不保存起来的话,返回的是第10个。

1
1
易萧
如果按照视频一开始的代码的话,返回的不就应该是第10个么。在添加resize的操作之前,视频中一开始的代码如下: T pop_back() { assert( size>0 ); size--; return data[size]; } 假设我们删除的是第11个元素,那么size--后再返回的本来就是data[10]。 这个时候就算resize了,那10也是最后一个元素。 当然,在后面的代码里备份元素的操作放在了resize--这就没话说。只是说逻辑上和前面不太对应。
2017-07-21
共1条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7408 学习 · 1150 问题

查看课程