日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高效使用Vector

發(fā)布時間:2025/6/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高效使用Vector 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

參考網(wǎng)頁: http://www.cnblogs.com/biyeymyhjob/archive/2013/05/11/3072893.html#undefined

1.初始化的時候,最好先用reserve分配空間。


vector<int> s;
s.reserve(n);

vector中一個成員被刪除,會導(dǎo)致后面的成員向前移動,因此進行大量復(fù)制和析構(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一個設(shè)計理念。)
出了作用域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的空間遠(yuǎn)遠(yuǎn)大于實際需要的。所有需要壓縮vector到它實際的大小。
reserve() 增加vector的占有空間,但不會賦值,所以訪問會發(fā)生越界。
resize()能夠增加或者減少vector的大小(size()值),同時賦值,所以可以訪問數(shù)據(jù)。
Clear()僅僅能夠改變緩存的大小,可以刪除元素,但不能減少占用的內(nèi)存。


我們可以通過一個vector創(chuàng)建另一個vector。讓我們看看這將發(fā)生什么。假定我們已經(jīng)有一個vector v,它的內(nèi)存大小為1000,當(dāng)我們調(diào)用size()的時候,它的大小僅為7。我們浪費了大量的內(nèi)存。讓我們在它的基礎(chǔ)上創(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)在是達(dá)到我的目的了,但是并不是很好的解決方法,我們可以像下面這么寫:
??? std::vector<CString>(v).swap(v);

你可以看到我們做了什么?我們創(chuàng)建了一個臨時變量代替那個命名的,然后使用swap(),這樣我們就去掉了不必要的空間,得到實際大小的v。
臨時變量在這句代碼之后就會被銷毀了。

?

5.vector的push_back是一個復(fù)制行為,先將要push的對象復(fù)制過來所以如果對象是作用域范圍比vector小的話,那么后面的操作就會造成非法訪問內(nèi)存。

轉(zhuǎn)載于:https://www.cnblogs.com/lewiskyo/p/4214598.html

總結(jié)

以上是生活随笔為你收集整理的高效使用Vector的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。