list 是最常用的 stl 庫之一,它的底層就是乙個帶頭的雙向迴圈鍊錶,所以我們在使用時也可以把它想象成這種鍊錶。下面我們模擬實現list。
在模擬實現 list 之前,我們首先要明確 list 的迭代器。迭代器的型別有兩種,第一種就是原生態的指標,例如vector的迭代器。第二種就需要我們自己來封裝,因為迭代器的使用和指標類似,所以我們需要明確一下幾點:
1. 對 operator*() 進行過載。
2. 對 operator->() 過載 訪問其所指空間的成員。
3. 對 operator++()、operator++(int) 、operator--()、operator--(int) 進行過載。
4. 對 operator!=() 和 operator==() 進行過載。
list迭代器失效:因為list的底層結構為帶頭結點的雙向迴圈鍊錶,因此在list中進行插入時是不會導致list的迭代器失效的,只有在刪除時才會失效,並且失效的只是指向被刪除節點的迭代器,其他迭代器不會受到影響。
模擬實現 list:
namespace smx
listnode* prev;
listnode* next;
t val;
}; templateclass iterator //迭代器類
iterator(const iterator& it) :pnode(it.pnode)
t& operator*()
t* operator->()
iterator& operator++()
iterator& operator++(int)
iterator& operator--()
iterator& operator--(int)
bool operator!=(const iterator& it)
bool operator==(const iterator& it)
private:
listnode* pnode;
}; templateclass reverseiterator //反向迭代器
reverseiterator(const reverseiterator& rit) :pnode(rit.pnode)
t& operator*()
t* operator->()
reverseiterator& operator++()
reverseiterator& operator++(int)
reverseiterator& operator--()
reverseiterator& operator--(int)
bool operator!=(const reverseiterator& rit)
bool operator==(const reverseiterator& rit)
private:
listnode* pnode;
}; templateclass constiterator //const 迭代器
constiterator(const constiterator& cit) :pnode(cit.pnode)
const t& operator*() const
const t* operator->() const
constiterator& operator++()
constiterator& operator++(int)
constiterator& operator--()
constiterator& operator--(int)
bool operator!=(const constiterator& it)
bool operator==(const constiterator& it)
private:
listnode* pnode;
}; templateclass constreverseiterator //反向 const迭代器
constreverseiterator(const constreverseiterator& crit) :pnode(crit.pnode)
const t& operator*() const
const t* operator->() const
constreverseiterator& operator++()
constreverseiterator& operator++(int)
constreverseiterator& operator--()
constreverseiterator& operator--(int)
bool operator!=(const constreverseiterator& rit)
bool operator==(const constreverseiterator& rit)
private:
listnode* pnode;
}; templateclass list
list(size_t n, const t& val = t())
}//templatelist(iterator first, iterator last)
}list(const_iterator first, const_iterator last)
}list(const list& l)
list& operator=(const list& l)
return *this;
} ~list()
iterator begin()
iterator end()
reverse_iterator rbegin()
reverse_iterator rend()
const_iterator cbegin() const
const_iterator cend() const
const_reverse_iterator crbegin() const
const_reverse_iterator crend() const
size_t size() const
return count;
} bool empty() const
void resize(size_t n, const t& value = t())
}if (_size < n)
}} t& front()
const t& front() const
t& back()
const t& back() const
void push_back(const t& value)
void pop_back()
}void push_front(const t& value)
void pop_front()
}iterator insert(iterator pos, const t& value)
iterator erase(iterator pos)
void clear()
phead->next = phead;
phead->prev = phead;
} private:
void createhead()
listnode* phead;
};}
STL 模擬實現list
list是標準模板庫中的乙個容器,實際上是一條帶頭節點的雙向鍊錶。通過與迭代器的組合使用,使得工作效率大大提高。要注意 迭代器只是為了訪問 修改和遍歷物件,不對空間進行管理。pragma once include using namespace std 定義鍊錶結點結構體 templatestruc...
STL 模擬實現List
list是可以在常數範圍內在任意位置進行插入和刪除的序列式容器,並且該容器可以前後雙向迭代,list的底層是雙向鍊錶結構。如下demo,我們分別用正向迭代器和反向迭代器訪問list元素 int main list int l1 array,array sizeof array sizeof arra...
模擬實現STL中list容器
mylist.h pragma once include reverseiterator.h templatestruct listnode 鍊錶的節點 假如沒有迭代器,而你又沒有提供print函式 即使提供也不一定能滿足使用者的列印需求 如果使用者想列印鍊錶裡面的資料,就必須知道鍊錶的內部結構 即...