迭代器模擬實現STL中的list

2021-07-30 23:36:38 字數 3078 閱讀 5292

list中的迭代器類似與智慧型指標的作用,它是將指向鍊錶指向結點的指標管理起來。

在stl中的list是帶頭結點的雙向迴圈鍊錶,這樣的設計很巧妙,可以讓我們的插入和刪除元素的時候減少一些需要考慮的邊界問題。

要模擬實現stl中的list我們首先得模擬實現迭代器,設計成用來管理指向list中結點的指標。因此要先給出迭代器這個類。所以在使用標準庫中的迭代器的時候實際上是定義了乙個迭代器物件,在這個物件的成員變數是指向結點的指標。

1、下面先來模擬實現list中的迭代器

首先需要了解迭代器它是可以遍歷容器中的元素的,也就是如果我們有乙個鍊錶,迭代器是可以訪問這個鍊錶中所有的節點的。

因此我們可以直接通過對迭代器的++或者–操作來遍歷整個鍊錶。如果對迭代器解引用我們可以直接訪問到指向結點的指標的成員變數data。也就是結點這個結構體中的成員變數data.如果迭代器使用!=操作是代表可以判斷當前指向結點的指標是否等於另乙個指向結點的指標。

因此在模擬實現list的迭代器的時候我們需要將這些操作符進行過載。另外我們在設計的時候由於有const型別和非const型別的,而標準庫中設計這個迭代器類的時候是非常巧妙地給出模板引數列表,因此我們可以仿照這種方式以此來提高**的高效和復用率。

template

class _listiterator

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

self operator++(int)//後置++效率低

t& operator*()

//直接通過對迭代器解引用操作就可以直接訪問結點中data的資料成員

ptr operator->()

//直接可以通過對it->就可以訪問結點中的成員

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

self operator--(int)

bool

operator!=(const _listiterator&l)

node*_node;

};//由於要去管理指向結點的指標,因此它的成員變數必然是指向結點的指標

給出了迭代器就可以通過迭代器來模擬實現stl中的list了

#include

#include

#include

using

namespace

std;

template

struct _listnode

_listnode* pnext;

_listnode* ppre;

t _data;

};//首先給出結點的結構體

template

class _listiterator

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

self operator++(int)//後置++效率低

t& operator*()

//直接通過對迭代器解引用操作就可以直接訪問結點中data的資料成員

ptr operator->()

//直接可以通過對it->就可以訪問結點中的成員

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

self operator--(int)

bool

operator!=(const _listiterator&l)

bool

operator==(const _listiterator&l)

node*_node;

};//由於要去管理指向結點的指標,因此它的成員變數必然是指向結點的指標

template

class list

list()//由於帶頭結點的迴圈雙向鍊錶需要構造出乙個頭結點並且頭和尾都指向它自己

~list()

iterator begin()

const_iterator begin()const

iterator end()

const_iterator end()const

void pushback(const t&data)

void popback()

void pushfront(const t&data)

void popfront()

iterator insert(iterator pos,const t&data)

iterator erase(iterator pos)

//只需要分兩種情況刪除的是頭結點還是非頭結點,高效

void clear()

}//刪除除了頭結點之外的所有元素

node *_phead;

};void myprint(list &l)

cout

<< endl;

}void funtest()//測試**

; listl2;

l2.pushback(aa());

list::iterator it2 = l2.begin();

it2->a;

listl1;

l1.pushback(1);

l1.pushback(2);

l1.pushback(3);

l1.pushfront(4);

l1.popfront();

l1.popback();

l1.clear();

list::iterator it1 = l1.begin();

while (it1 != l1.end())

}int main()

小結:

首先這個迭代器的設計很巧妙**復用率很高:它給出的模板引數列表是

template

於是我們用const 型別的迭代器的時候自然會去呼叫const 型別的一系列的操作符過載的成員函式。使用非const型別的迭代器自然會去呼叫非const 型別的一系列的操作符過載的成員函式

而且在設計成帶頭結點的迴圈雙向鍊錶之後,我們就可以將刪除尾結點和刪除中間結點使用同一種方式來處理,更加方便。

在簡單的模擬實現了stl中的list之後可以深刻的體會到stl中的list的設計的巧妙之處。這種框架還是很值得自己去學習的。

list迭代器的模擬實現

namespace bite listnode ppre listnode pnext t val list 的迭代器 迭代器有兩種實現方式,具體應根據容器底層資料結構實現 1.原生態指標,比如 vector 2.將原生態指標進行封裝,因迭代器使用形式與指標完全相同,因此在自定義的類中必須實現以下方...

STL 模擬實現list

list是標準模板庫中的乙個容器,實際上是一條帶頭節點的雙向鍊錶。通過與迭代器的組合使用,使得工作效率大大提高。要注意 迭代器只是為了訪問 修改和遍歷物件,不對空間進行管理。pragma once include using namespace std 定義鍊錶結點結構體 templatestruc...

STL模擬實現vector

首先給出所需要實現的函式介面和類的封裝 templateclass vector 接下來給出上面介面的具體的實現,但是其中有 型別萃取,因為需要根據不同的資料型別進行不同的賦值方式,從而提高程式的效率。下面給出所有的實現 和我自己的測試 struct truetype struct falsetyp...