剖析容器List

2021-08-03 21:53:49 字數 3311 閱讀 1224

零個或者多個資料元素的有限序列;

a. 是乙個序列:元素之間有順序,每乙個元素都有前驅和後繼;(這裡的鍊錶是乙個帶頭節點的雙向迴圈鍊錶)

b. 有限的;

綜上所述:listnode的模型如下:

迭代器:一種遍歷容器的方式,只作遍歷,修改的作用,不析構節點;分為:普通迭代器(可讀可改),const迭代器(可讀不可改),反向迭代器(反向遍歷);

模擬實現正向迭代器基本功能,**如下:

& operator++()//前置++

self operator++(int)//後置++

self

& operator--()//前置--

self operator--(int)//後置--

ref operator*()//ref == t&

ptr operator->()//返回了乙個指標,其實就是如何將乙個迭代器轉化成乙個指標,使其具有指標變數的屬性

bool operator!=(const self

& t) const

};//具有頭節點的雙向迴圈鍊錶

template

class _list

_list()//這是乙個含有頭節點的雙向鍊錶,所以頭節點也應該有空間,裡面的存放的資料可以設定為預設值

~_list()

//普通的迭代器

iterator begin()

iterator end()

//const迭代器

iteratorconst begin() const

iteratorconst end() const

//沒有使用迭代器以前

node* find(const t&

data)

return _head;

}//使用迭代器以後

iterator find(const t&

data)

return it;

}//沒有使用迭代器之前

void _clear()

_head->_next = _head;

_head->_prev = _head;

}//使用迭代器以後

void clear_iterator()

_head->_next = _head;

_head->_prev = _head;

}// 設計乙個雙向鍊錶,實現隨機位置的插入和刪除,在pos的前面進行插入

void insert(const node* pos,const t&

data)

void insert(iterator pos, const t&

data)

iterator erase(iterator& pos)//刪除

void popfront()//頭刪

void popback()//尾刪

void pushfront(const t&

data)//頭插

void pushback(const t&

data)//尾插

bool isempty()

//模板內的成員函式也可以設計成模板函式

template

//將某個物件區間內的值拷貝到當前物件中

void assign(inputiterator first,inputiterator last)//[)左閉右開的區間}};

3.迭代器失效問題:

4.反向迭代器:

不管是正向迭代器還是反向迭代器,在遍歷我們的list中的元素時都是要從begin()所指向的那個節點開始的,然後乙個乙個往下執行,直到發現當前所指向的那個節點 == end()而結束;

對於反向迭代器而言,我們用begin()開始進行遍歷的時候都是訪問的是它所指向的下乙個節點,在這裡可能就比較繞了。這裡的下乙個節點我們使用」- -「的方式進行訪問,那麼你一定有疑問了,看圖之後「- -」,那麼就直接 == end()了,那麼遍歷才剛開始就結束了嗎?當然不是,這裡我們要注意,我們的下乙個節點是針對正向迭代器而言的,正向迭代器的「- -」,就是反向迭代器的「++」。

**如下:

充分利用正向迭代器進行函式的復用;

//反向迭代器:

template

class reveriterator

self& operator++()//前置++

self operator++(int)//後置++

self& operator--()//前置--

self operator--(int)//後置--

//typename的意思是強調後面修飾的這個是乙個型別,模板類的內嵌型別,用typename強調

typename iterator::reference operator*()

typename iterator::pointer operator->()

bool

operator!=(const self& cur)

};

list中增添以下**:

typedef reveriteratorreiterator;

typedef reveriteratorreiteratorconst;

reiterator rbegin()

reiterator rend()

reiteratorconst rbegin() const

reiteratorconst rend() const

《STL原始碼剖析》 序列式容器(二)list容器

list概述 相較於vector的連續線性空間,list就有點複雜了,但複雜有複雜的好處,每次插入或刪除乙個元素,就配置或釋放乙個元素。因此list不存在浪費空間的問題。而且對於任何位置插入或釋放元素,時間是常值。list的迭代器 首先list的節點 node 是乙個雙向鍊錶。另外list不能像ve...

list容器和forward list容器

list就是乙個雙向鍊錶,只支援雙向順序訪問,並且還是乙個環形鍊錶。因此list只需要乙個指標就可以完整表現整個鍊錶。如果讓指標node指向刻意置於尾端的乙個空白節點,node便能符合stl對於前閉後開的要求,成為last迭代器。相較於vector的連續線性空間,list就顯得複雜許多,他的好處是每...

容器篇 list容器(上)

基於vs2017編譯通過 include include include using namespace std void printlist list int list 構造初始化 void test01 list int list5 arr,arr sizeof arr sizeof int 陣...