課程筆記 02 資料結構(清華) 向量

2021-07-03 19:15:15 字數 2542 閱讀 2286

向量是陣列的擴張。二者同是採用順序儲存方式的資料型別,所不同的是向量的封裝性好、抽象度高,具有更好的安全效能與更多的操作介面。

在c++環境下,向量模板類可以如下定義:

typedef int rank //定義秩

#define defualt_capacity //定義預設容量

template

class vector //向量模板類

private:

rank _size;

int _capacity;

t* _elem;

protected:

/*內部函式*/

public:

/*建構函式*/

/*析構函式*/

/*唯讀介面*/

/*可寫介面*/

/*遍歷介面*/

/*其他……*/

/*--向量的基本操作--*/

建構函式和析構函式是類的基本方法,其實現如下:

vector(int c = defualt_capacity) //預設建構函式

vector(t* const a, rank lo, rank hi) //複製函式區間

vector(vectorconst & v, rank lo,  rank hi) //複製向量區間

vector(vectorconst & v) //複製向量區間

~vector() //析構函式

上面的建構函式所使用的複製函式實現如下:

void vector::copyfrom(t* const a, rank lo, rank hi)

_elem = new t[2*(hi - lo)]; //分配足夠大的儲存空間

_size = 0; //規模清空

while (lo < hi) //將a[lo, hi)元素逐個

_elem[size++] = a[lo++]; //複製到_elem[0, hi - lo)中

/*--向量的容量調整--*/

為了應對不同例項對於資料儲存規模的要求,我們設定了預設容量值以保證向量規模。在這裡,整型變數_capacity用來記錄向量的最大容量,而_size則用於記錄向量的實際長度。由於例項中向量的元素可能會有大量的變動,因此我們需要定義擴容及縮容操作以方便及時的調整容量從而既能保證需求,又能避免浪費。擴容操作的實現如下:

void vector::expand()

if (_size < _capacity) return; //尚未滿員時,不必擴容

_capacity = max(_capaticy, defualt_capacity); //確保容量不小於預設值

t *old_elem = elem; //記錄原有資料

elem = new t[_capacity *= 2]; //容量加倍

for (int i = 0; i < _size; i++)

_elem[i] = old_elem[i]; //複製原向量的內容

delete old_elem; //釋放原空間

相應的可定義縮容操作,其實現如下:

void vector::shrink()

if (_size*2 >= _capacity) return; //尚未缺半時,不必縮容

t *old_elem = _elem; //記錄原有資料

_elem = new t[_capacity /= 2]; //容量減半

for (int i = 0; i < _size; i++)

_elem[i] = old_elem[i]; //複製原向量的內容

delete old_elem; //釋放原空間

/*--無序向量的重要介面--*/

訪問向量元素時,可像訪問陣列一樣使用下標,或稱為循秩訪問。這需要過載下標操作符""

t & vector::operator(rank r) const

插入單元素:

rank vector::insert(rank r, t *e) // 在秩為r處插入元素e

expand();

for (int i = _size; i > r; i--)

_elem[i] = _elem[i - 1];

_elem[r] = e;

_size++;

return r;

刪除整區間:

int vector::remove(rank lo, rank hi) //刪除區間[lo, hi)

if ( hi <= lo ) return 0; // 判別刪除物件是否為空

while ( hi < _size)

_elem[lo++] = _elem[hi++]; //[lo, hi)順次前移

_size = lo;

shrink(); //若有必要,則更新規模

return ( hi - lo );

刪除單元素:

t vector::remove(rank r)

t e = _elem[r]; //備份欲刪除元素

remove(r, r+1); //呼叫區間刪除函式

return e; //返回被刪除元素的值

課程筆記 05 資料結構(清華) 向量 排序

起泡排序 先來看起泡排序的一般版本 template void vector bubblesort rank lo,rank hi 演算法框架 逐趟做掃瞄交換 bool vector bubble ranklo,rank hi 單趟掃瞄交換 bool sorted true 整體有序標誌 while...

課程筆記 08 資料結構(清華) 列表 讀寫介面

在介紹循位置訪問 查詢元素等唯讀操作以及插入 刪除 去重等可寫操作前,先講講初始化方法與複製建構函式的實現。void list init header new listnode tailor new listnode header.succ tailor header.pred null tailo...

資料結構(C ) 向量 筆記1

首先解決第乙個問題。直接在原有的物理記憶體空間的基礎上追加空間,不現實。陣列特定的定址方式,物理空間必須連續,我們無法保證,其尾部總是留有足夠的空間供其擴充套件。一種可行的方法是如上圖所示,申請乙個容量足夠大的陣列,並將原來陣列中的資料進行複製,此後便可以插入新元素e而不至於溢位。當然,原陣列所佔的...