stl 模擬實現list

2021-09-09 05:46:52 字數 3652 閱讀 9427

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函式 即使提供也不一定能滿足使用者的列印需求 如果使用者想列印鍊錶裡面的資料,就必須知道鍊錶的內部結構 即...