Vectors删除操作eraes记录,只是尾部指针前移,并没有删除原来的数据

Vector<int> nums;

一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

一道非常简单的力扣题,在用vector处理时出现了以下问题;

1.

测试用例[1,1,2]

输出结果[1]

返回size=1;

原因以及解决办法:it迭代器指向最后一个元素的后一个位置,如图

输出

解决办法将it!=nums.end()改为it!=nums.end()-1;

2.

在问题1的测试过程中发现最后一个元素总是会被删除(在自己的测试用例中最后一个元素没有重复项,不应该被删除),按照图一的逻辑应该只删除重复元素。

int s[7]={1,2,2,3,4,4,7};

将此数组存到vector中再用erase按照图一的逻辑删除重复元素。

原因以及解决办法:

测试将nums按照删除前的大小输出,发现得到的结果为

1  2  3  4  7  7  7

说明erase操作仅将容器的尾指针前移了,删除位置后的元素全部前移覆盖前面的元素,但并没有删除原来的数据,由于vector申请的是一片连续的空间,所以在比较最后一对元素的过程中,由于问题一没有解决,便将删除后nums的最后一个元素7与指向最后一个元素后一个位置(it.end())的元素比较,原来的7没有删除,比较之后重复便将7删掉了。

总结:vector申请连续空间,当vector扩容时并不是在原来的基础上增加空间,而是申请一片更大的连续空间将数据全部复制过去。删除元素时不需要增加空间所以保持原来的空间不变,又空间连续,所以即便删除后nums.size()会变小,但当指针超出size但没有超出原空间大小时不会发生越界。指针返回的数据为原来存储在此地址的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值