1 erase函數(shù)有沒有重新分配內(nèi)存,釋放原有數(shù)組空間?2 v.erase( remove( v.begin(), v.end(), 0) , v.end() )請問這個(gè)有沒有重新分配內(nèi)存?為何我這教程上說,即使用先前的迭代器也不會出現(xiàn)訪問到不存在元素的錯誤(這意思就是說,沒有重新分配內(nèi)存?)3 教程里還說,為了實(shí)現(xiàn)刪除元素后容器自動縮小,每次erase后,向量要重新分配內(nèi)存,并復(fù)制所有元素。這極大的影響性能。因?yàn)闃?biāo)準(zhǔn)庫把釋放內(nèi)存的選擇交給了程序員,讓程序員選擇放還是不放。你可以使用v.swap(vector<T>(v)) 來釋放多余的內(nèi)存。對于第3點(diǎn),有疑問:1、erase既然重新分配了,難道他沒有自動釋放原來的空間?如果自動釋放了,那么從何而來的讓程序員決定是否釋放?2、swap是交換,跟釋放多余的空間,在這里扯上什么關(guān)系?
1 回答

藍(lán)山帝景
TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
沒有重新分配。但是后續(xù)的元素被往前移動,因此被刪除的元素之后的迭代器會失效。例如,下面的代碼在debug模式下將會崩潰,在release模式下正常運(yùn)行而且可以看到數(shù)組的地址并沒有改變。
#include <vector> #include <iostream> int main(){ std::vector< int > v{ 1, 2, 3, 4, 5, 6, 7 }; auto p = v.end() - 2; std::cout << &v[0] << "\t" << *p << "\t" << &*p << "\n" ; v.erase(v.begin() + 2); std::cout << &v[0] << "\t" << *p << "\t" << &*p << "\n" ; return 0; } |
v.swap(vector<T>(v));將v復(fù)制到新的向量中(這個(gè)向量的容量正好和v的大小一樣),然后與v進(jìn)行交換。因?yàn)檫@是一個(gè)局部變量,所以這句話結(jié)束時(shí)會將從v處獲得的內(nèi)存釋放。同時(shí),v在交換之后,容量和大小一致。
建議你看一下源代碼,或者單步調(diào)試看看具體的執(zhí)行過程。
- 1 回答
- 0 關(guān)注
- 146 瀏覽
添加回答
舉報(bào)
0/150
提交
取消