您好,登錄后才能下訂單哦!
下面的代碼給出了vector的基本使用舉例。
#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; }
vector其中一個特點:內存空間只會增長,不會減小。為了支持快速的隨機訪問,vector容器的元素以連續方式存放,每一個元素都緊挨著前一個元素存儲。設想一下,當vector添加一個元 素時,為了滿足連續存放這個特性,都需要重新分配空間、拷貝元素、撤銷舊空間,這樣性能難以接受。因此STL實現者在對vector進行內存分配時,其實際分配的容量要比當前所需的空間多一些。就是說,vector容器預留了一些額外的存儲區,用于存放新添加的元素,這樣就不必為每個新元素重新分配整個容器的內存空間。
在調用push_back時,每次執行push_back操作,相當于底層的數組實現要重新分配大小;這種實現體現到vector實現就是每當 push_back一個元素,都要重新分配一個大一個元素的存儲,然后將原來的元素拷貝到新的存儲,之后在拷貝push_back的元素,最后要析構原有的vector并釋放原有的內存。例如下面程序:
#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的析構函數。
由于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++編譯沒有通過)
如果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();
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。