一般在講記憶體配置策略時,「書本上」講的策略大概如下。

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);
}

 

 

edisonx 發表在 痞客邦 PIXNET 留言(0) 人氣()