STL vector的几种清空容器(删除)办法
1、為什么需要主動(dòng)釋放vector內(nèi)存
?
來自 <https://blog.csdn.net/hellokandy/article/details/78500067>
?
vector其中一個(gè)特點(diǎn):內(nèi)存空間只會增長,不會減小,援引C++ Primer:為了支持快速的隨機(jī)訪問,vector容器的元素以連續(xù)方式存放,每一個(gè)元素都緊挨著前一個(gè)元素存儲。設(shè)想一下,當(dāng)vector添加一個(gè)元素時(shí),為了滿足連續(xù)存放這個(gè)特性,都需要重新分配空間、拷貝元素、撤銷舊空間,這樣性能難以接受。因此STL實(shí)現(xiàn)者在對vector進(jìn)行內(nèi)存分配時(shí),其實(shí)際分配的容量要比當(dāng)前所需的空間多一些。就是說,vector容器預(yù)留了一些額外的存儲區(qū),用于存放新添加的元素,這樣就不必為每個(gè)新元素重新分配整個(gè)容器的內(nèi)存空間。
?
在調(diào)用push_back時(shí),每次執(zhí)行push_back操作,相當(dāng)于底層的數(shù)組實(shí)現(xiàn)要重新分配大小;這種實(shí)現(xiàn)體現(xiàn)到vector實(shí)現(xiàn)就是每當(dāng)push_back一個(gè)元素,都要重新分配一個(gè)大一個(gè)元素的存儲,然后將原來的元素拷貝到新的存儲,之后在拷貝push_back的元素,最后要析構(gòu)原有的vector并釋放原有的內(nèi)存。
?
2、怎么釋放vector的內(nèi)存
來自 <https://blog.csdn.net/hellokandy/article/details/78500067>
?
A、對于數(shù)據(jù)量不大的vector,沒有必要自己主動(dòng)釋放vector,一切都交給操作系統(tǒng)。
B、但是對于大量數(shù)據(jù)的vector,在vector里面的數(shù)據(jù)被刪除后,主動(dòng)去釋放vector的內(nèi)存就變得很有必要了!
由于vector的內(nèi)存占用空間只增不減,比如你首先分配了10000個(gè)字節(jié),然后erase掉后面9999個(gè),留下一個(gè)有效元素,但是內(nèi)存占用仍為10000個(gè)。所有內(nèi)存空間是在vector析構(gòu)時(shí)候才能被系統(tǒng)回收。empty()用來檢測容器是否為空的,clear()可以清空所有元素。但是即使clear(),vector所占用的內(nèi)存空間依然如故,無法保證內(nèi)存的回收。如果需要空間動(dòng)態(tài)縮小,可以考慮使用deque。如果vector,可以用swap()來幫助你釋放內(nèi)存。
?
clear使用之后,并不能清空數(shù)據(jù),其數(shù)據(jù)再未被覆蓋之前是不會改變的,個(gè)人猜測clear僅僅把指針挪動(dòng)到了起始位置。
#include?<iostream>#include?<vector>using?namespace?std;//STL?vector的幾種清空容器(刪除)辦法void?test(){vector<int>?vecnum;vecnum.push_back(1);vecnum.push_back(2);vecnum.push_back(3);vecnum.push_back(4);vecnum.push_back(5);vecnum.push_back(6);vecnum.push_back(7);//打印vector的大小和容量cout?<<?"old:?size?=?"?<<?vecnum.size()?<<?"?;?capacity?=?"?<<?vecnum.capacity()?<<?endl;//1.?clear(),清空元素,但不回收空間vecnum.clear();cout?<<?"new1:?size?=?"?<<?vecnum.size()?<<?"?;?capacity?=?"?<<?vecnum.capacity()?<<?endl;//2.?使用?erase循環(huán)刪除,結(jié)果同上vector<int>::iterator?it;for?(it?=?vecnum.begin();?it?!=?vecnum.end();?){//注意使用erase()方法時(shí),迭代不要隨意的++it?=?vecnum.erase(it);}cout?<<?"new2:?size?=?"?<<?vecnum.size()?<<?"?;?capacity?=?"?<<?vecnum.capacity()?<<?endl;//結(jié)論:erase在每次操作時(shí),迭代器指針會整體前移1,就是每次都會移動(dòng)全部數(shù)據(jù),所以vector不適合做頻繁刪除的容器//3.?最簡單的使用swap,清除元素并回收內(nèi)存vector<int>().swap(vecnum);//打印vector的大小和容量cout?<<?"new2:?size?=?"?<<?vecnum.size()?<<?"?;?capacity?=?"?<<?vecnum.capacity()?<<?endl;}int?main(){test();getchar();return?0;}運(yùn)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的STL vector的几种清空容器(删除)办法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用大数据算法得出当代移动互联网人群图鉴
- 下一篇: 调用支付jsapl缺少参数:totalf