STL源码剖析 序列式容器 slist
生活随笔
收集整理的這篇文章主要介紹了
STL源码剖析 序列式容器 slist
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
- STL l i s t 是個(gè)雙向鏈表(double linked lis t) 。SGI STL提供了一個(gè)單向鏈 表 (single linked lis t) , 名 為 slist
- ?s l i s t 和 l i s t 的主要差別在于,前者的迭代器屬于單向的Forwardlterotor, 后者的迭代器屬于雙向的Bidirectional Iterator.為此,s l i s t 的功能自然也就受到許多限制。不過,單向鏈表所耗用的空間更小,某些操作更快,不失為另一種選擇。
- list使用雙向的Bidirectional Iterator可以雙向移動(dòng)
- slist使用單向的Forwardlterotor只可以單向移動(dòng)
- s l i s t 和 l i s t 共同具有的一個(gè)相同特色是,它們的插入(insert)、移除 (erase) 、接 合 (splice) 等操作并不會(huì)造成原有的迭代器失效(當(dāng)然啦,指向被 移除元素的那個(gè)迭代器,在移除操作發(fā)生之后肯定是會(huì)失效的)
- 插入操作會(huì)將新元素插入于指定位置之前,而非之后。
- 然而作為一個(gè)單向鏈表,s lis t沒有任何方便的辦法可以回頭定出前一個(gè)位置, 因此它必須從頭找起。換句話說,除了 s lis t起點(diǎn)處附近的區(qū)域之外,在其它位置 上采用insert或 erase操作函數(shù),都屬不智之舉。這便是s lis t相較于l i s t 之下的大缺點(diǎn)。為此,s l i s t 特別提供了 insert_after ()和 erase_after ()供靈活運(yùn)用。
- 基于同樣的(效率)考慮,s l i s t 不提供push_back(),只提供push_front ()。因此s lis t 的元素次序會(huì)和元素插入進(jìn)來的次序相反。list插入元素每次都會(huì)在頭部執(zhí)行,因此速度較快,但是插入元素的順序和list中元素的存儲(chǔ)順序相反。
?
?
?
- ?注意,比較兩個(gè)Slist迭代器是否等同時(shí)(例如我們常在循環(huán)中比較某個(gè)迭代器是否等同于Slist .end()),
- 由于 _ slist_iterator 并未對 operator==實(shí) 施重載,所以會(huì)調(diào)用_slist_iterator_base::operator==□ 根據(jù)其中之定義, 我們知道,兩 個(gè) Slist迭代器是否等同,視 其 一 slist_node_base* node是否等同而定。
?
?
?
?
?
- ?首先依次序把元素9,1,2,3,4插入到s l i s t ,實(shí)際結(jié)構(gòu)呈現(xiàn)如圖4-26。 接下來搜尋元素1 ,并將新元素99插入進(jìn)去,如圖4-27。
- 注意,新元素被插入在插入點(diǎn)(元素1 )的前面而不是后面。
- 接下來搜尋元素3 ,并將該元素移除,如圖4-28.
?
?
?
總結(jié)
以上是生活随笔為你收集整理的STL源码剖析 序列式容器 slist的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POS机刷卡被风控多久能解除?找到原因是
- 下一篇: android ros 节点编写_嵌入式