向量模板類

2021-08-14 06:37:54 字數 1460 閱讀 1468

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 ...