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...