slist 是 SGI STL 提供的單向鏈表容器,不屬於 C++ 標準。相比雙向鏈表 list,slist 節點更小、插入刪除特定位置效率更高,但只能正向遍歷。
struct _Slist_node_base { _Slist_node_base* _M_next; };
template <class _Tp>
struct _Slist_node : public _Slist_node_base { _Tp _M_data; };
__slist_make_link 在指定節點後插入新節點,O(1)__slist_previous 從頭遍歷找前驅,O(n)__slist_splice_after 將一段鏈表移動到指定位置後,O(1)__slist_reverse 就地反轉鏈表,O(n)前向迭代器 _Slist_iterator,支援 ++ 操作。before_begin() 返回頭節點前的虛擬位置,便於統一使用 insert_after/erase_after。
// 插入操作統一用 insert_after iterator insert_after(iterator __pos, const value_type& __x); void insert_after(iterator __pos, size_type __n, const value_type& __x); template <class _InIter> void insert_after(iterator __pos, _InIter __first, _InIter __last); // 刪除操作統一用 erase_after iterator erase_after(iterator __pos); iterator erase_after(iterator __before_first, iterator __last); // 兼容性接口(內部調用前驅查找) iterator insert(iterator __pos, const value_type& __x); iterator erase(iterator __pos);
merge() 歸併兩個有序 slist,sort() 採用底層合併排序(桶式合併),O(n log n)unique() 刪除相鄰重複元素remove_if() 按謂詞刪除| 特性 | slist | list |
|---|---|---|
| 節點大小 | 1 指針 | 2 指針 |
| 反向遍歷 | 不支援 | 支援 |
| 任意位置插入 | 需查前驅 O(n) | O(1) |
| splice 效率 | O(1) | O(1) |