- STL l i s t 是個雙向鏈表(double linked lis t) 。SGI STL提供了一個單向鏈 表 (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可以雙向移動
- slist使用單向的Forwardlterotor只可以單向移動
- s l i s t 和 l i s t 共同具有的一個相同特色是,它們的插入(insert)、移除 (erase) 、接 合 (splice) 等操作并不會造成原有的迭代器失效(當然啦,指向被 移除元素的那個迭代器,在移除操作發生之后肯定是會失效的)
- 插入操作會將新元素插入于指定位置之前,而非之后。
- 然而作為一個單向鏈表,s lis t沒有任何方便的辦法可以回頭定出前一個位置, 因此它必須從頭找起。換句話說,除了 s lis t起點處附近的區域之外,在其它位置 上采用insert或 erase操作函數,都屬不智之舉。這便是s lis t相較于l i s t 之下的大缺點。為此,s l i s t 特別提供了 insert_after ()和 erase_after ()供靈活運用。
- 基于同樣的(效率)考慮,s l i s t 不提供push_back(),只提供push_front ()。因此s lis t 的元素次序會和元素插入進來的次序相反。list插入元素每次都會在頭部執行,因此速度較快,但是插入元素的順序和list中元素的存儲順序相反。
?
?
?
- ?注意,比較兩個Slist迭代器是否等同時(例如我們常在循環中比較某個迭代器是否等同于Slist .end()),
- 由于 _ slist_iterator 并未對 operator==實 施重載,所以會調用_slist_iterator_base::operator==□ 根據其中之定義, 我們知道,兩 個 Slist迭代器是否等同,視 其 一 slist_node_base* node是否等同而定。
?
?
?
?
?
- ?首先依次序把元素9,1,2,3,4插入到s l i s t ,實際結構呈現如圖4-26。 接下來搜尋元素1 ,并將新元素99插入進去,如圖4-27。
- 注意,新元素被插入在插入點(元素1 )的前面而不是后面。
- 接下來搜尋元素3 ,并將該元素移除,如圖4-28.
?
?
?