條款17:使用交換技巧來修正過剩容量
本節條款告訴我們,如果你有一個vector的容器,容器的容量是10000,但是,現在只用了1,那麼爲了節省內存,我們應該只保留使用的vector容量,多餘的容量應該釋放。
那麼,怎麼釋放呢?
作者提供了一種方式,如下代碼:
vector<int> a;
a.reserve(10000);
a.push_back(1);
vector<int>(a).swap(a);
以上代碼做了什麼?
很簡單,a先是申請了10000的容量空間,接着使用了1個單位空間,最後,利用一個臨時vector,根據拷貝構造函數,複製了a中的數據(此時臨時對象的容量爲1,因爲vector的拷貝構造函數只分配拷貝的元素需要的內存)。通過swap方法讓a還剩1個容量空間。
stirng也是一樣
string s;
s.reserve(10000);
s.push_back('sss');
vector<int>(s).swap(s);
條款18:避免使用vector<bool>
本節主要就是說,bool的vector容器不是真正存儲bool類型的對象,而是vector設計者用了位域的思想,直白的說就是一個bool對象由一個bit表示,而不是一個字節。
所以,vector<bool>
對象不能執行如下操作
:
vector<bool>v;
bool*pb=&v[0];//錯誤
如果深入探討其中構造,則類型&v[0]
返回的是reference*
引用類型。