templaterank vector::insert(t const & e, rank r)
注意:元素搬遷的順序不能顛倒,否則會因元素被覆蓋而造成資料丟失。向量結構的插入較之列表結構,複雜度就集中在元素搬遷上,線性正比於字尾的長度。考慮最壞情況,依次從首部插入,元素移動個數成幾何級數由n遞減至1。故總體時間複雜度為o(n+n-1+n-2+….+1)=o(n^2)。
由於向量元素的特性,考察一組向量。刪除元素3,需要將4,5順次前移乙個單元,與插入元素同理,每次單個刪除乙個元素,需要時間線性正比其後繼元素。若區間刪除(2(rank),4(rank))變為而所費時間與刪除單個元素3完全相同。故應採用區間刪除的辦法來取代單個元素。
template
intvector
::remove(rank lo, rank hi)
_size = lo;
shrink();//裝填因子25%為界,低於25%將縮容
return hi-lo;
}
過載remove()介面以實現單元素刪除。
template
t vector
::remove(rank r)
else
return null;
}
對於無序向量來說,唯一化的辦法只有遍歷一遍向量o(n),剔除重複的,刪除元素需要反覆呼叫remove()介面。也需要o(n)時間。即總體時間複雜度為o(n^2)的時間。
template
intvector
::deduplicate()
return oldsize-_size;
}
針對有序向量,唯一化的工作即可在o(n)時間內完成。無序向量唯一化,時間複雜度主要集中在每次呼叫remove()介面上,每次只移動乙個單元,如果能標記位置,一次前移多個單元,時間複雜度將大大下降。
以為例。
採用deduplicate()介面,當指標處理到rank(3)時,find(_elem[3], 0,3)=2這時呼叫一次remove()介面,在接下來的4次比對中,需要連續呼叫4次remove()介面,這將大大提公升複雜度。若能直接呼叫remove(2,7)即可在o(9+5)時間結束任務。
在處理當前問題是,發現重複元素必然是緊鄰出現的。採取如下思路:
template
intvector
::uniquify()
return j - i;
}
i與j分別指向下一對相鄰子區間的首元素每次將檢查一對兒資料元素,故可在o(n)時間內完成任務。 使用模板表示式的向量類
numeric.h ifndef numeric h define numeric h include memcpy include std using namespace std namespace numeric template class expr sub template class ex...
使用模板表示式的向量類
numeric.h ifndef numeric h define numeric h include memcpy include std using namespace std namespace numeric template class expr sub template class ex...
類模板 模板類
下面定義的是類模板,用int例項化t後成為模板類。例項化類模板的語法 類名 模板實參表 結合下例即 array就是將類模板array例項化為模板類的語法。類模板 include using namespace std templateclass array array t operator int ...