C vector使用的一些注意事項

2022-10-03 15:42:26 字數 2640 閱讀 9057

1. 初始化

c++ 11以後新增了大括號{}的初始化方式,需要注意與()的區別,如:

std::vector vectest1(5);         //初始化5個元素,每個都是0

std::vectorwww.cppcns.comt> vectest2;       //初始化1個元素,值是5

2.  新增元素:push_back

通過push_back新增新的元素進入vector後,vector的內程式設計客棧存有時候會發生變化,這取決於size和capacity大小,當然這些都是系統來處理的,詳細可以參考stl原始碼

當size

當size==capacity的時候,會重新申請另外一塊記憶體,然後copy過去加到尾部,這個時候就會有變化了。

對於stl的容器,都有成員:

begin()  //起始位置

end() //結束位置

size() //當前大小

capacity() //當前容量,即已申請的記憶體大小

vector是一段連續的記憶體空間,有三個標識記憶體的位置,start,end,finish, size=end-start, capacity=finish-start

很多時候在使用vectdjhmzdsor的時候,會看到size=capacity,這個時候直接新增元素到尾部,記憶體明顯是不夠的,此時會重新在別處分配一塊大小足夠

有時候也有size

std::cout << "vecnumwww.cppcns.com push back init" << std::endl;

vector vecnum(5);

std::cout << "vecnum addr: " << &vecnum << std::endl;

for(auto i = 5; i < 10; i++)

std::cout << "vecnum addr: " &vecnum << std::endl;

3. 關於earse和remove

erase返回的是當前刪除的元素的一下個位置的迭代器,所以需要注意的是遍歷時候的++運算,這個與其它list,map差不多,

需要注意的earse後記憶體並未真正的清空,僅僅是刪除內容,真正的容量大小capacity並沒有改變,需要通過swap來實現capacity的減小

全部清空可以考慮:vector().swap(vecnum);

auto itor = vecnum.begin();

for( ; itor != vecnum.end(); )

else }

std::cout << "after erase element 60:" << std::endl;

printvector(vecnum);

vector(vecnum).swap(vecnum); //將vecnum的記憶體空洞清除

printvector(vecnum);

//remove只是通過迭代器的指標向前移動來刪除,將不需要刪除的元素往前移,因此需要刪除的就都在尾部了

//返回新的指向尾部需要刪除的元素的迭代器

因此還是得配合earse來使用,所以一般真要刪除,建議直接遍歷使用earse

auto itor = remove_if(vecnum.begin(), vecnum.end(),(int x)->bool);

//or

//auto itor = remove(vecnum.begin(), vecnum.end(),20);

//通過erase刪除

vecnum.erase(itor, vecnum.end());

4. 關於vector< bool>  -- 慎用

出處:

vector< bool> 並不是乙個stl容器,不是乙個stl容器,不是乙個stl容器!

首先vector< bool> 並不是乙個通常意義上的vector容器,這個源自於歷史遺留問題。

早在c++98的時候,就有vector< bool>這個型別了,但是因為當時為了考慮到節省空間的想法,所以vector< bool>裡面不是乙個byte乙個byte儲存的,它是乙個bit乙個bit儲存的!

因為c++沒有直接去給乙個bit來操作,

所以用operator的時候, 正常容器返回的應該是乙個對應元素的引用,

但是對於vector< bool>實際上訪問的是乙個」proxy reference」而不是乙個」true reference」,返回的是」std::vector< bool>:reference」型別的物件。

因此,使用auto自動型別推導時會出現問題

//vector慎用

vector vecbool = ;

bool test1 = vecbool[0];

auto test2 = vecbool[1];

test1 = true; //test1的初始化它其實暗含了乙個隱式的型別轉換(直接對vecbool[0]賦值會修改vecbool中的值,但是對test1不會)

test2 = false; //test2它的型別並不是bool,而是乙個vector< bool>中的乙個內部類,而此時如果修改test2的值,vecbool中的值也會跟著修改

auto index = 0;

for (auto i : vecbool)

總結本文標題: c++ vector使用的一些注意事項

本文位址:

windows mysql 安裝的一些注意事項

以管理員身份執行,在命令列輸入cd mysql的bin目錄的安裝路徑 c windows system32 cd c program files mysql mysql server5.6 bin c program files mysql mysql server5.6 bin mysqld re...

使用malloc和free時的一些注意事項

在c中,動態記憶體是乙個讓人又愛又恨的,這裡對malloc和free的使用進行一定的小介紹。一般而言,先通過malloc 或calloc等函式 分配動態記憶體,然後通過free來進行記憶體的釋放。但有時會出現free失敗的情況。如下列程式 include include include int ma...

使用malloc和free時的一些注意事項

2017年09月12日 20 02 47 在c中,動態記憶體是乙個讓人又愛又恨的,這裡對malloc和free的使用進行一定的小介紹。一般而言,先通過malloc 或calloc等函式 分配動態記憶體,然後通過free來進行記憶體的釋放。但有時會出現free失敗的情況。如下列程式 include i...