零個或者多個資料元素的有限序列;
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 陣...