C list類及常用介面實現

2021-10-07 05:27:52 字數 2489 閱讀 6839

因為list時雙向鍊錶,其內部存的不只有資料,還有前後指標,直接解引用會出錯

還有它的物理儲存空間不是連續的,++,–操作是向前/後偏移一定的大小,而下乙個緊挨的物理空間可能是沒有申請的

所以將原生態指標進行封裝,因迭代器使用形式與指標完全相同,因此在自定義的類中必須實現以下方法:

指標可以解引用,迭代器的類中必須過載operator * ()

指標可以通過->訪問其所指空間成員,迭代器類中必須過載oprator->()

指標可以++向後移動,迭代器類中必須過載operator++()與operator++(int)

至於operator–() / operator–(int)釋放需要過載,根據具體的結構來抉擇,雙向鍊錶可

以向前 移動,所以需要過載,如果是forward_list就不需要過載–

迭代器需要進行是否相等的比較,因此還需要過載operator == ()與operator != ()

#include

using namespace std;

//雙向帶頭迴圈鍊錶

template

struct listnode};

/*因為list時雙向鍊錶,其內部存的不只有資料,還有前後指標,直接解引用會出錯

還有它的物理儲存空間不是連續的,++,--操作是向前/後偏移一定的大小,而下乙個緊挨的物理空間可能是沒有申請的

所以將原生態指標進行封裝,因迭代器使用形式與指標完全相同,因此在自定義的類中必須實現以下方法:

1. 指標可以解引用,迭代器的類中必須過載operator * ()

2. 指標可以通過->訪問其所指空間成員,迭代器類中必須過載oprator->()

3. 指標可以++向後移動,迭代器類中必須過載operator++()與operator++(int)

至於operator--() / operator--(int)釋放需要過載,根據具體的結構來抉擇,雙向鍊錶可

以向前 移動,所以需要過載,如果是forward_list就不需要過載--

4. 迭代器需要進行是否相等的比較,因此還需要過載operator == ()與operator != ()*/

template

struct listiterator

//解引用: *iterator ---> 獲取節點value

ref operator*()

// 指標->成員,一般list元素為自定義型別時用

ptr operator->()

// ++: 移動到下乙個元素的位置

self& operator++()

self& operator--()

bool operator!=

(const self& it)

bool operator==

(const self& it)

node* _node;};

template

class list

iterator end()

const_iterator begin()

const

const_iterator end()

const

//建構函式

list()

:_header

(new node)

//插入函式insert

void

insert

(iterator pos,

const t& val)

//刪除會導致迭代器失效

iterator erase

(iterator pos)

return pos;

}void

pushback

(const t& val)

void

pushfront

(const t& val)

void

popback()

void

popfront()

//獲得鍊錶元素個數

size_t size()

const

//析構

~list()

}//清空所有非頭結點函式

void

clear()

//重新構建迴圈結構

_header->_next = _header->_prev = _header;

}list

(const list

& lst)

:_header

(new node)

//現**法

list

& operator=

(list lst)

private:

node* _header;};

//範圍for遍歷鍊錶元素

template

void

printlistfor

(const list

& lst)

cout << endl;

}

C List集合類常用操作 一

所有操作基於以下類 class employees public string name public string city public datetime birthdate list 初始化 list類的新例項,該例項為空並且具有預設初始容量。listemployees new list em...

c list 類的模擬實現

list的模擬實現 list的構成 list在底層是一條雙向迴圈鍊錶,可以在常數時間內完成插入和刪除操作。最主要的缺點是無法隨機訪問。而在鍊錶可以將其中元素儲存在不相關的位置。list的組成 list的本身和list的節點是不同的結構,list本身是由乙個個的節點構成的。所以只需要完成對鍊錶的操作即...

C List 類擴充套件例項及相關問題

靜態類,靜態方法,this關鍵字 擴充套件方法三要素 namespace system.linq return default t program類呼叫 class program new user user user list.getsearchobj u u.name.contains 張 us...