STL 模擬實現List

2021-09-27 12:36:39 字數 2824 閱讀 3715

list是可以在常數範圍內在任意位置進行插入和刪除的序列式容器,並且該容器可以前後雙向迭代,list的底層是雙向鍊錶結構。

如下demo,我們分別用正向迭代器和反向迭代器訪問list元素

int

main()

; list<

int>

l1(array, array +

sizeof

(array)

/sizeof

(array[0]

)); list<

int>

::iterator it = l1.

begin()

;//正向1234

while

(it != l1.

end())

//逆向4321

list<

int>

::reverse_iterator it2 = l1.

rbegin()

;while

(it2 != l1.

rend()

)system

("pause");

return0;

}

iterator insert (iterator position,

const value_type& val)

;

注意list的插入要先拿到迭代器的位置

另外它過載兩種介面,一是再迭代器位置插入n個val,一是在迭代器位置

插入乙個start到end區間內所有元素

void insert (iterator position, size_type n,

const value_type& val)

;template

<

class

inputiterator

>

void insert (iterator position, inputiterator first,

inputiterator last)

;

int

main()

iterator erase (iterator position)

;

list的刪除也是通過迭代器來實現,並返回乙個迭代器位置,另外過載了乙個介面,

可以實現範圍刪除。

要注意的是這裡返回的迭代器是被刪元素的下乙個元素,如果最後乙個元素也被刪了,那麼它就是容器的結尾

iterator erase (iterator first, iterator last)

;

lt.

insert

(it, lt2.

begin()

, lt2.

end())

;//2,100,100,200,200,1;

it = lt.

erase

(it)

;//2,100,100,200,200

list<

int>

::iterator it2 = lt.

begin()

; it2++

; lt.

erase

(it2, it)

;//2

list在刪除元素時,會出現問題

例如我們刪除了中間位置節點,++迭代器時,就會崩潰,因為對於雙向鍊錶找到下個節點,需要有前乙個節點

解決辦法:

list的底層實際上是乙個雙向帶頭節點鍊錶,所有它的節點就包括指向前後的指標,以及節點的值

struct listnode

listnode

*_prev;

listnode

*_next;

t _val;

};

頭的前後都指向自己

list()

:_head

(new node)

構造新節點,更新新節點的指標指向,以及前後節點的指標指向

void

insert

(iterator pos,

const t&val)

通過迭代器找到刪除位置,儲存前後指標指向,刪除這個節點,更新指標指向

iterator erase

(iterator pos)

return pos;

}

list的迭代器需要封裝乙個類來實現,原生指標無法實現,所以它必須封裝乙個指標所有的功能。`

template

<

classt,

class

ptr,

class

ref>

struct listiterator

ref operator*(

) ptr operator

->()

self&

operator++(

)bool

operator!=(

const self& lt)

bool

operator==(

const self& lt)

};

STL 模擬實現list

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

stl 模擬實現list

list 是最常用的 stl 庫之一,它的底層就是乙個帶頭的雙向迴圈鍊錶,所以我們在使用時也可以把它想象成這種鍊錶。下面我們模擬實現list。在模擬實現 list 之前,我們首先要明確 list 的迭代器。迭代器的型別有兩種,第一種就是原生態的指標,例如vector的迭代器。第二種就需要我們自己來封...

模擬實現STL中list容器

mylist.h pragma once include reverseiterator.h templatestruct listnode 鍊錶的節點 假如沒有迭代器,而你又沒有提供print函式 即使提供也不一定能滿足使用者的列印需求 如果使用者想列印鍊錶裡面的資料,就必須知道鍊錶的內部結構 即...