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