list容器

list容器


此节大致讲解LIst的底层实现,依旧使用VS STL

List容器内部也存在一个_Mypair,而不像vector,里面的_Scary_val是很长的一段,List的_Scary_val很简单。

using _Scary_val = _List_val<_Val_types>;

让我们进入到_List_val里面看看一个List都有什么

...
_Nodeptr _Myhead;
size_type _Mysize;
...

不像vector里面的三个pointer,list里面只含有一个ptr和一个size_type,分别用来标识list的头节点和list的size。也正是因为这样,所以list不存在容量的概念,当然,他也不需要。

list还有一个很重要的结构——node。在list中你能看到这样一条using

using _Node=_List_Node<_Ty, typename allocator_traits<_Alloc>::
                                                      void_pointer>;>

他的两个模板参数指出了节点内部的值的类型和指针类型。

_List_node结构如下所示:

_Nodeptr _Next; //successor node, or first element if head
_Nodeptr _Prev; // predecessor node, or last element if head
_Value_type _Myval; // the stored value, unused if head

根据注释和声明,我们这回了解了,list内部是一个环形的双向list,头节点不使用,它的next指向第一个元素,而prev指向最后一个元素。

这样,list中begin()end()等可以直接使用头节点来实现。比如end()

_NODISCARD const_iterator end() const noexcept {
   
    return const_iterator(_Mypair._Myval2._Myhead, 
                          _STD addressof(_Mypair._Myval2));
}

别忘了,STL的区间要求是左闭右开的,所以直接返回head节点的iterator就行了。


insert

我们依旧是使用insert函数查看list是如何分配内存和运作起来的。

直接来吧!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值