猿问

请问erase函数有没有重新分配内存?

1 erase函数有没有重新分配内存,释放原有数组空间?

2 v.erase( remove( v.begin(), v.end(), 0) , v.end() )

请问这个有没有重新分配内存?为何我这教程上说,即使用先前的迭代器也不会出现访问到不存在元素的错误(这意思就是说,没有重新分配内存?)

3 教程里还说,为了实现删除元素后容器自动缩小,每次erase后,向量要重新分配内存,并复制所有元素。

这极大的影响性能。因为标准库把释放内存的选择交给了程序员,让程序员选择放还是不放。你可以使用

v.swap(vector<T>(v)) 来释放多余的内存。

对于第3点,有疑问:

1、erase既然重新分配了,难道他没有自动释放原来的空间?如果自动释放了,那么从何而来的让程序员决定是否释放?

2、swap是交换,跟释放多余的空间,在这里扯上什么关系?

有只小跳蛙
浏览 109回答 1
1回答

蓝山帝景

没有重新分配。但是后续的元素被往前移动,因此被删除的元素之后的迭代器会失效。例如,下面的代码在debug模式下将会崩溃,在release模式下正常运行而且可以看到数组的地址并没有改变。#include&nbsp;<vector>#include&nbsp;<iostream>&nbsp;int&nbsp;main(){&nbsp;&nbsp;&nbsp;&nbsp;std::vector<int>&nbsp;v{&nbsp;1,&nbsp;2,&nbsp;3,&nbsp;4,&nbsp;5,&nbsp;6,&nbsp;7&nbsp;};&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;p&nbsp;=&nbsp;v.end()&nbsp;-&nbsp;2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;&v[0]&nbsp;<<&nbsp;"\t"&nbsp;<<&nbsp;*p&nbsp;<<&nbsp;"\t"&nbsp;<<&nbsp;&*p&nbsp;<<&nbsp;"\n";&nbsp;&nbsp;&nbsp;&nbsp;v.erase(v.begin()&nbsp;+&nbsp;2);&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;&v[0]&nbsp;<<&nbsp;"\t"&nbsp;<<&nbsp;*p&nbsp;<<&nbsp;"\t"&nbsp;<<&nbsp;&*p&nbsp;<<&nbsp;"\n";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}v.swap(vector<T>(v));将v复制到新的向量中(这个向量的容量正好和v的大小一样),然后与v进行交换。因为这是一个局部变量,所以这句话结束时会将从v处获得的内存释放。同时,v在交换之后,容量和大小一致。建议你看一下源代码,或者单步调试看看具体的执行过程。
随时随地看视频慕课网APP
我要回答