- 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.