list的模拟实现
list的构成
list在底层是一条双向循环链表,可以在常数时间内完成插入和删除操作。最主要的缺点是无法随机存取。而在链表可以将其中元素存储在不相关的位置。
list的组成
list的本身和list的节点是不同的结构,list本身是由一个个的节点构成的。所以只需要完成对链表的操作即可。
list的节点类
与c中一样,每一个节点都有数据域前后指针,通过一个类来构造每一个节点
template<class T> //节点类
struct ListNode{
typedef ListNode* point_type;
point_type _prev;
point_type _next;
T _data;
ListNode(const T& value = T())
:_prev(nullptr),
_next(nullptr),
_data(value)
{}
};
list的迭代器类
list中的迭代器并不与之前的vetcor一样是原生指针,而是需要我们进行封装,主要是对于运算符进行重载已达到目的
正向迭代器
template<class T,class Ref,class Ptr>
struct List_iterator{
typedef ListNode<T> Node;
typedef List_iterator<T,Ref,Ptr> self;
typedef T value_type;
Node* _node; //指向list中的每个节点的指针
//迭代器的构造
List_iterator(Node* node)
:_node(node)
{}
T& operator*()
{
return _node->_data;
}
T* operator->()
{
return &(operator*());
}
//迭代器的比较
bool operator==(const self& node)
{
return _node == node._node;
}
bool operator!=(const self& node)
{
return _node != node._node;
}
//迭代器的++
//对于操作运算符++,--的重载,编译器底层认为有两个参数的为后置++,一个参数的为前置++
self operator++() //前置++
{
_node = _node->_nex