STL之 list 和 slist

相较于 vector 的连续线性空间,list 就显得复杂许多,它的好处是每次安插 或删除㆒个元素,就配置或释放㆒个元素空间。因此,list 对于空间的运用有绝 对的精准,㆒点也不浪费。而且,对于任何位置的元素安插或元素移除,list 永 远是常数时间。

                                                                         节点示意图   

由于 STL list 是㆒个双向串行(double linked-list),迭代器必须具备前移、后 移的能力。所以 list 提供的是 Bidirectional Iterators。 list 有㆒个重要性质:安插动作(insert)和接合动作(splice)都不会造成原有 的 list 迭代器失效。这在 vector 是不成立的,因为 vector 的安插动作可能 造成记忆体重新配置,导致原有的迭代器全部失效。甚至 list 的元素删除动作(erase),也只有「指向被删除元素」的那个迭代器失效,其它迭代器不受任何 影响。

                                  

SGI list 不仅是㆒个双向串行,而且还是㆒个环状双向串行。所以它只需要㆒个 指标,便可以完整表现整个串行。

 

 

slist 和 list 的主要差别在于,前者的迭代器属于单向的 Forward Iterator,后 者的迭代器属于双向的 Bidirectional Iterator。为此,slist 的功能自然也就受到 许多限制。不过,单向串行所耗用的空间更小,某些动作更快,不失为另㆒种选 择。

注意,根据 STL 的习惯,安插动作会将新元素安插于指定位置之前,而非之后。 然而做为㆒个单向串行,slist 没有任何方便的办法可以回头定出前㆒个位置, 因此它必须从头找起。换句话说,除了 slist 起始处附近的区域之外,在其它位 置㆖采用 insert 或 erase 操作函式,都是不智之举。这便是 slist 相较于 list 之㆘的大缺点。为此,slist 特别提供了 insert_after() 和 erase_after() 供 弹性运用。

基于同样的(效率)考虑,slist 不提供 push_back(),只提供 push_front()。 因此 slist 的元素次序会和元素安插进来的次序相反。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值