close
一般在講記憶體配置策略時,「書本上」講的策略大概如下。
1. 若 size >= capacity,realloc capacity = 2 * capacity。
2. 若 size < capacity / 4 , realloc capacity = 0.5 * capacity。
這大概是一般學校教學給較一般的策略。
要看 vector 實際使用個數,用 vector<T> :: size() ;
要看 vector 實際配置記憶體個數,用 vector<T>::capacity()。
實際上大多 compiler 在實作 vector 之配置策略時,不會很順的照著上面的準則,
< 大致可推測出來,realloc 這動作愈少愈好! >
而且很尬尷的是,若對記憶體要求較高,想要即使放掉所佔用之記憶體,
用其 clear、erase、resize 這些 data member 也沒辦法將記憶體清掉。
解決方式有兩種,一種是間接用 pointer 操作 vector。
vector<int> *v = new vector<int>; v->resize(100); cout << v->size() << endl; delete v;
這種方式很不方便,試想一下如果要用 subscript operator 時會長怎樣
vector<int> *v = new vector<int>; v->resize(100); for(size_t i=0; i<v->size(); ++i) { v->operator[] ( i ) = i; /* setter */ cout << v->at(i) << endl; /* getter */ } delete v;
目前大多流傳的方式,是開一個同 type 之 vector,其 capacity 一開始為 0 ,做 swap 動作,如下所示。
vector<int> v(1000); /* after do something */ /* want to clear current.. */ vector<int> zero; // zero(0); v.swap(zero);
網路上大多只介紹至此,筆者認為有包成 function 之必要才對,
遇到 vector of vector、vector of vector of ... 才不尷尬。
template<typename T> inline void vec_clr(vector<T> & v){ vector<T> t; v.swap(t); }
全站熱搜
留言列表