C++ vector使用的一些注意事項
1. 初始化
c++ 11以后新增了大括號{}的初始化方式,需要注意與()的區(qū)別,如:
std::vector<int> vecTest1(5); //初始化5個元素,每個都是0
std::vector<int> vecTest2{ 5 }; //初始化1個元素,值是5
2. 添加元素:push_back
通過push_back添加新的元素進入vector后,vector的內(nèi)存有時候會發(fā)生變化,這取決于size和capacity大小,當然這些都是系統(tǒng)來處理的,詳細可以參考stl源碼
當size<capacity的時候,直接加到末尾,不會變化
當size==capacity的時候,會重新申請另外一塊內(nèi)存,然后copy過去加到尾部,這個時候就會有變化了。
對于stl的容器,都有成員:
begin() //起始位置
end() //結(jié)束位置
size() //當前大小
capacity() //當前容量,即已申請的內(nèi)存大小
vector是一段連續(xù)的內(nèi)存空間,有三個標識內(nèi)存的位置,start,end,finish, size=end-start, capacity=finish-start
很多時候在使用vector的時候,會看到size=capacity,這個時候直接添加元素到尾部,內(nèi)存明顯是不夠的,此時會重新在別處分配一塊大小足夠
有時候也有size<capacity, 這個時候就直接加在尾部了。
std::cout << "vecNum push back init" << std::endl; vector<int> vecNum(5); std::cout << "vecNum addr: " << &vecNum << std::endl; for(auto i = 5; i < 10; i++) { vecNum.push_back(i*10); std::cout << "vecNum push_back(" << i << ")=" << i*10 << std::endl; std::cout << "vecNum.size() = " << vecNum.size() << ",vecNum.capacity() = " << vecNum.capacity() << std::endl; std::cout << "vecNum.begin() addr: " << &(*vecNum.begin()) << std::endl; } std::cout << "vecNum addr: " << &vecNum << std::endl;
3. 關(guān)于earse和remove
erase返回的是當前刪除的元素的一下個位置的迭代器,所以需要注意的是遍歷時候的++運算,這個與其它list,map差不多,
需要注意的earse后內(nèi)存并未真正的清空,僅僅是刪除內(nèi)容,真正的容量大小capacity并沒有改變,需要通過swap來實現(xiàn)capacity的減小
全部清空可以考慮:vector<int>().swap(vecNum);
auto itor = vecNum.begin(); for( ; itor != vecNum.end(); ) { auto num = *itor; if(num == 60) { itor = vecNum.erase(itor); break; } else { itor++; } } std::cout << "after erase element 60:" << std::endl; printVector(vecNum); vector<int>(vecNum).swap(vecNum); //將vecNum的內(nèi)存空洞清除 printVector(vecNum);
//remove只是通過迭代器的指針向前移動來刪除,將不需要刪除的元素往前移,因此需要刪除的就都在尾部了
//返回新的指向尾部需要刪除的元素的迭代器
因此還是得配合earse來使用,所以一般真要刪除,建議直接遍歷使用earse
auto itor = remove_if(vecNum.begin(), vecNum.end(),[](int x)->bool{ return x == 20; }); //or //auto itor = remove(vecNum.begin(), vecNum.end(),20); //通過erase刪除 vecNum.erase(itor, vecNum.end());
4. 關(guān)于vector< bool> -- 慎用
出處: https://www.jb51.net/article/167636.htm
vector< bool> 并不是一個STL容器,不是一個STL容器,不是一個STL容器!
首先vector< bool> 并不是一個通常意義上的vector容器,這個源自于歷史遺留問題。
早在C++98的時候,就有vector< bool>這個類型了,但是因為當時為了考慮到節(jié)省空間的想法,所以vector< bool>里面不是一個Byte一個Byte儲存的,它是一個bit一個bit儲存的!
因為C++沒有直接去給一個bit來操作,
所以用operator[]的時候, 正常容器返回的應(yīng)該是一個對應(yīng)元素的引用,
但是對于vector< bool>實際上訪問的是一個”proxy reference”而不是一個”true reference”,返回的是”std::vector< bool>:reference”類型的對象。
因此,使用auto自動類型推導(dǎo)時會出現(xiàn)問題
//vector<bool>慎用 vector<bool> vecBool = { false, true, false }; bool test1 = vecBool[0]; auto test2 = vecBool[1]; test1 = true; //test1的初始化它其實暗含了一個隱式的類型轉(zhuǎn)換(直接對vecBool[0]賦值會修改vecBool中的值,但是對test1不會) test2 = false; //test2它的類型并不是bool,而是一個vector< bool>中的一個內(nèi)部類,而此時如果修改test2的值,vecBool中的值也會跟著修改 auto index = 0; for (auto i : vecBool) { cout << "vecBool[" << index << "]" << i << std::endl; index++; }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支持。
上一篇:C語言中指針的加減運算方法示例
欄 目:C語言
下一篇:VS2010+Opencv+MFC讀取圖像和視頻顯示在Picture控件
本文標題:C++ vector使用的一些注意事項
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/223.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言沒有round函數(shù) round c語言
- 01-10使用OpenGL實現(xiàn)3D立體顯示的程序代碼
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10c++中inline的用法分析
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?