您好,登錄后才能下訂單哦!
以前使用vector容器一直有個誤區=。=,然后最近面試被鄙視了QWQ
先說一下vector容器的簡單原理:
對于vector容器而言,數據結構就是數組,在STL中我有剖析源碼。其中實現的是相當于數組的方面,然后其中對于容器的操作函數都有:
push_back
Add element at the end (public member function )
pop_back
Delete last element (public member function )
insert
Insert elements (public member function )
erase
Erase elements (public member function )
swap
Swap content (public member function )
clear
Clear content (public member function )
emplace
Construct and insert element (public member function )
emplace_back
Construct and insert element at the end (public member function )
在這之中。插入操作我們就暫且不提。就是數組的數據插入。
現在說一下關于vector容器中的空間設置
vector中有2個大小指標,一個是size:代表當前數據的大小
另外一個是capacity.代表著當前vector所申請的空間大小
下面提一下空間配置器。對于STL所有的容器而言,都是使用STL內部實現的alloc(內存池)進行空間的申請。vector是一個靜態的空間,也就是我們申請以后就無法進行修改了。
以前我很蠢的直接調用clear然后就清除數據就ok了,然后空間隨著作用域進行釋放。。
結果這樣會有很大的內存浪費。。
所以解決方法是這樣
//加一對大括號是可以讓tmp退出{}的時候自動析構{ std::vector<int> tmp = nums; nums.swap(tmp); }
通過swap函數進行空間轉換,然后就出去作用域vector就進行了釋放。
在標準一點是這樣的:
template < class T >void ClearVector( vector< T >& vt ) { vector< T > vtTemp; veTemp.swap( vt ); }
就是通過作用域還有swqp的搭配進行空間的釋放,然后就OK了
下面提一個小問題:
如果vector中存放的是指針,那么當vector銷毀時,這些指針指向的對象不會被銷毀,那么內存就不會被釋放。如下面這種情況,vector中的元素時由new操作動態申請出來的對象指針:
for (vector<void *>::iterator it = v.begin(); it != v.end(); it ++) if (NULL != *it) { delete *it; *it = NULL; } v.clear();
當時很sb的就回答成這種情況了,面壁面壁。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。