日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

C++ STL中vector用法简要总结

發布時間:2025/3/21 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ STL中vector用法简要总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.基本使用舉例


下面的代碼給出了vector的基本使用舉例。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 #include?<iostream> #include?<vector> #include?<algorithm> #include?<cstdlib> using?namespace?std; typedef?vector<int>?INTVECTOR; int?main(void) { vector<int>?num;???//?STL中的vector容器 int?element; //?從標準輸入設備讀入整數, //?直到輸入的是非整型數據為止 while?(cin?>>?element)?????//ctrl+Z?結束輸入 ???num.push_back(element); //?STL中的排序算法 sort(num.begin(),?num.end()); //?將排序結果輸出到標準輸出設備 for?(int?i?=?0;?i?<?num.size();?i?++) ???cout?<<?num[i]?<<?"?"; cout<<endl; ????//vec1對象初始為空 ????INTVECTOR?vec1;?? ????//vec2對象最初有10個值為6的元素 ????INTVECTOR?vec2(10,6); ????//vec3對象最初有3個值為6的元素 ????INTVECTOR?vec3(vec2.begin(),vec2.begin()+3); ????//聲明一個名為i的雙向迭代器 ????INTVECTOR::iterator?i; ????//從前向后顯示vec1中的數據 ????cout<<"vec1.begin()--vec1.end():"<<endl; ????for?(i?=vec1.begin();?i?!=vec1.end();?++i) ????????cout?<<?*i?<<?"?"; ????cout?<<?endl; ????//從前向后顯示vec2中的數據 ????cout<<"vec2.begin()--vec2.end():"<<endl; ????for?(i?=vec2.begin();?i?!=vec2.end();?++i) ????????cout?<<?*i?<<?"?"; ????cout?<<?endl; ????//從前向后顯示vec3中的數據 ????cout<<"vec3.begin()--vec3.end():"<<endl; ????for?(i?=vec3.begin();?i?!=vec3.end();?++i) ????????cout?<<?*i?<<?"?"; ????cout?<<?endl; ????//測試添加和插入成員函數 ????vec1.push_back(2); ????vec1.push_back(4); ????vec1.insert(vec1.begin()+1,5);?//在第一個位置后插入5 ????vec1.insert(vec1.begin()+1,vec3.begin(),vec3.end());//在第一個位置后插入ve3開始到結束的數字 ????cout<<"push()?and?insert():"?<<endl; ????for?(i?=vec1.begin();?i?!=vec1.end();?++i) ????????cout?<<?*i?<<?"?"; ????cout?<<?endl; ????//測試賦值成員函數 ????vec2.assign(8,1);//重新給vec2賦了8個值1 ????cout<<"vec2.assign(8,1):"?<<endl; ????for?(i?=vec2.begin();?i?!=vec2.end();?++i) ????????cout?<<?*i?<<?"?"; ????cout?<<?endl; ????//測試引用類函數 ????cout<<"vec1.front()="<<vec1.front()<<endl; ????cout<<"vec1.back()="<<vec1.back()<<endl; ????cout<<"vec1.at(4)="<<vec1.at(4)<<endl; ????cout<<"vec1[4]="<<vec1[4]<<endl; ????//測試移出和刪除 ????vec1.pop_back();//最高位前移一位(去掉最高位) ????cout<<"vec1.pop_back():"?<<endl; ????for?(i?=vec1.begin();?i?!=vec1.end();?++i) ????????cout?<<?*i?<<?"?"; ????cout?<<?endl; ????vec1.erase(vec1.begin()+1,vec1.end()-2);//清除?vec1.begin()+1到vec1.end()-2 ????cout<<"vec1.erase():"?<<endl; ????for?(i?=vec1.begin();?i?!=vec1.end();?++i) ????????cout?<<?*i?<<?"?"; ????cout?<<?endl; ????//顯示序列的狀態信息 ????cout<<"vec1.capacity():?"<<vec1.capacity()<<endl;?//capacity()?告訴你最多添加多少個元素才會導致容器重分配內存 ????cout<<"vec1.max_size():?"<<vec1.max_size()<<endl; ????cout<<"vec1.size():?"<<vec1.size()<<endl;???//size()?是告訴你容器當中目前實際有多少個元素 ????cout<<"vec1.empty():?"<<vec1.empty()<<endl; ????//vector序列容器的運算 ????cout<<"vec1==vec3:?"<<(vec1==vec3)<<endl;?//相等返回1,不相等返回0 ????cout<<"vec1<=vec3:?"<<(vec1<=vec3)<<endl;?//小于等于返回1,否則返回0 ???system("pause"); ???return?0; }

2.內存分配與釋放

1.vector的內存增長

vector其中一個特點:內存空間只會增長,不會減小。為了支持快速的隨機訪問,vector容器的元素以連續方式存放,每一個元素都緊挨著前一個元素存儲。設想一下,當vector添加一個元 素時,為了滿足連續存放這個特性,都需要重新分配空間、拷貝元素、撤銷舊空間,這樣性能難以接受。因此STL實現者在對vector進行內存分配時,其實際分配的容量要比當前所需的空間多一些。就是說,vector容器預留了一些額外的存儲區,用于存放新添加的元素,這樣就不必為每個新元素重新分配整個容器的內存空間。

在調用push_back時,每次執行push_back操作,相當于底層的數組實現要重新分配大小;這種實現體現到vector實現就是每當 push_back一個元素,都要重新分配一個大一個元素的存儲,然后將原來的元素拷貝到新的存儲,之后在拷貝push_back的元素,最后要析構原有的vector并釋放原有的內存。例如下面程序:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include?<iostream>#include?<cstdlib>#include?<vector>using?namespace?std;class?Point {public: ????????Point() ????????{ ????????????cout?<<?"construction"?<<?endl; ????????} ????????Point(const?Point&?p) ????????{ ????????????cout?<<?"copy?construction"?<<?endl; ????????}????????~Point() ????????{ ????????????cout?<<?"destruction"?<<?endl; ????????} };int?main() { ????vector<Point>?pointVec; ????Point?a; ????Point?b; ????pointVec.push_back(a); ????pointVec.push_back(b); ????cout<<pointVec.size()<<std::endl;????return?0; }

輸出結果:

其中執行

pointVec.push_back(a);

此時vector會申請一個內存空間,并調用拷貝構造函數將a放到vector中

再調用

pointVec.push_back(b);

此時內存不夠 需要擴大內存,重新分配內存 這時再調用拷貝構造函數將a拷貝到新的內存,再將b拷入新的內存,同時有人調用Point拷貝構造函數,最后釋放原來的內存 此時調用Point的析構函數。

?

2.vector的內存釋放

由于vector的內存占用空間只增不減,比如你首先分配了10,000個字節, 然后erase掉后面9,999個,留下一個有效元素,但是內存占用仍為10,000個。所有內存空間是在vector析構時候才能被系統回收。 empty()用來檢測容器是否為空的,clear()可以清空所有元素。但是即使clear(),vector所占用的內存空間依然如故,無法保證內存 的回收。

如果需要空間動態縮小,可以考慮使用deque。如果vector,可以用swap()來幫助你釋放內存。具體方法如下:

vector<Point>().swap(pointVec);?//或者pointVec.swap(vector<Point>?())

標準模板:

template?<?class?T?>void?ClearVector(?vector<?T?>&?vt?)? {vector<?T?>?vtTemp;?veTemp.swap(?vt?); }

swap()是交換函數,使vector離開其自身的作用域,從而強制釋放vector所占的內存空間,總而言之,釋放vector內存最簡單的方 法是vector<Point>().swap(pointVec)。當時如果pointVec是一個類的成員,不能把 vector<Point>().swap(pointVec)寫進類的析構函數中,否則會導致double free or corruption (fasttop)的錯誤,原因可能是重復釋放內存。(前面的pointVec.swap(vector<Point> ())用G++編譯沒有通過)

?

3.其他情況釋放內存

如果vector中存放的是指針,那么當vector銷毀時,這些指針指向的對象不會被銷毀,那么內存就不會被釋放。如下面這種情況,vector中的元素時由new操作動態申請出來的對象指針:

#include?<vector>? using?namespace?std;?vector<void?*>?v;

每次new之后調用v.push_back()該指針,在程序退出或者根據需要,用以下代碼進行內存的釋放:

for?(vector<void?*>::iterator?it?=?v.begin();?it?!=?v.end();?it?++)?if?(NULL?!=?*it)?{delete?*it;?*it?=?NULL;} v.clear();

















本文轉自朱先忠老師51CTO博客,原文鏈接:http://blog.51cto.com/zhuxianzhong/1531773 ,如需轉載請自行聯系原作者

總結

以上是生活随笔為你收集整理的C++ STL中vector用法简要总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。