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