STL源码剖析 序列式容器 slist

53 篇文章 1 订阅
  • 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.

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值