高效使用Vector
參考網(wǎng)頁: http://www.cnblogs.com/biyeymyhjob/archive/2013/05/11/3072893.html#undefined
1.初始化的時候,最好先用reserve分配空間。
vector<int> s;
s.reserve(n);
vector中一個成員被刪除,會導致后面的成員向前移動,因此進行大量復制和析構(gòu)操作。
vector不適合做有大量插入,刪除操作的容器,因為拷貝內(nèi)存本身浪費很大。
capacity會以兩倍的容量擴大。
少用push_back()多用reserve加賦值操作。
shrink_to_fit 調(diào)整capacity使其大小u與size相等。
2.訪問元素優(yōu)先使用at,越界的時候可以捕捉異常。
vector<int> v;
v.reserve(10);
for(int i=0; i<7; i++)
??? v.push_back(i);
try
{
?int iVal1 = v[7];? // not bounds checked - will not throw
?int iVal2 = v.at(7); // bounds checked - will throw if out of range
}
catch(const exception& e)
{
?cout << e.what();
}
3.從vector中有效地刪除數(shù)據(jù)??(刪除1到多個同樣的數(shù)據(jù))
?for (iter = member.begin();iter!=member.end();)
??? {
?? ??? ?if (*iter == 2)
?? ??? ?{
?? ??? ??? ?iter = member.erase(iter);//即使不重新賦值也對,erase不會變成野指針。
?? ??? ?}
?? ??? ?else
?? ??? ??? ?++iter;
??? }
4.壓縮一個臃腫的vector (但如果壓縮后,你依然要大量添加元素到這個vector,那效率還是會很低,倒不如不壓縮,這也是vector一個設計理念。)
出了作用域vector還是會自動釋放內(nèi)存的。
壓縮一個臃腫的vector clear不能真正釋放內(nèi)存,因為clear之后假如用戶還要繼續(xù)添加元素的話,可以避免重新分配內(nèi)存。
resize,reserve,clear 均不會改變capacity 即容器依然占用capacity*each element空間大小的內(nèi)存。
很多時候大量地刪除數(shù)據(jù),或者通過使用reserve(),結(jié)果vector的空間遠遠大于實際需要的。所有需要壓縮vector到它實際的大小。
reserve() 增加vector的占有空間,但不會賦值,所以訪問會發(fā)生越界。
resize()能夠增加或者減少vector的大小(size()值),同時賦值,所以可以訪問數(shù)據(jù)。
Clear()僅僅能夠改變緩存的大小,可以刪除元素,但不能減少占用的內(nèi)存。
我們可以通過一個vector創(chuàng)建另一個vector。讓我們看看這將發(fā)生什么。假定我們已經(jīng)有一個vector v,它的內(nèi)存大小為1000,當我們調(diào)用size()的時候,它的大小僅為7。我們浪費了大量的內(nèi)存。讓我們在它的基礎上創(chuàng)建一個vector。
std::vector<CString> vNew(v);
cout << vNew.capacity();
vNew.capacity()返回的是7。這說明新創(chuàng)建的只是根據(jù)實際大小來分配的空間。現(xiàn)在我們不想釋放v的內(nèi)容,因為我們要在其它地方用到它,我們可以使用swap()將v和vNew互相交換一下。
??? vNew.swap(v);
??? cout << vNew.capacity();
??? cout << v.capacity();
有趣的是:vNew.capacity()是1000,而v.capacity()是7。
現(xiàn)在是達到我的目的了,但是并不是很好的解決方法,我們可以像下面這么寫:
??? std::vector<CString>(v).swap(v);
你可以看到我們做了什么?我們創(chuàng)建了一個臨時變量代替那個命名的,然后使用swap(),這樣我們就去掉了不必要的空間,得到實際大小的v。
臨時變量在這句代碼之后就會被銷毀了。
?
5.vector的push_back是一個復制行為,先將要push的對象復制過來所以如果對象是作用域范圍比vector小的話,那么后面的操作就會造成非法訪問內(nèi)存。
轉(zhuǎn)載于:https://www.cnblogs.com/lewiskyo/p/4214598.html
總結(jié)
以上是生活随笔為你收集整理的高效使用Vector的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PS制作高光导航背景
- 下一篇: 用qsort排序