文章目录
list 介绍
STL中的list底层实现是用带头循环的双链表,这种结构设计巧妙的使得list能够在随机位置插入删除的效率搞,但处理不了大量数据,相比于vector,vector的随机位置删除的速度就低于list ,因为vector需要挪动数据,而list直接把链子相接就可以了
那么list在使用的时候不难,stl的容器相似性很强,所以这次list的实现能更让我们学会c++关于封装的理解,c++类和对象的巩固,通过各种模板的类型,迭代器的封装,反向迭代器的封装使用
构造函数、拷贝构造函数、析构函数
我们在写链表的时候,都需要重新定义一个链表的结构体,现在也不例外
封装一个链表类
template<class T>
struct list_Node
{
T _data;
list_Node<T>* _next;//下一个链表指针
list_Node<T>* _prev;//上一个链表指针
//链表的构造函数
list_Node(const T& x = T())
:_data(x)
,_next(nullptr)
,_prev(nullptr)
{
}
};
在此需要再封装一个迭代器
迭代器
这个封装的迭代器是指属于list的,我们之前学习迭代器把他看作指针一样,这次的话我们把迭代器看作是一个迭代器类,不再是所谓一样上的指针
//迭代器的模板ref = T& ptr = T*
template<class T,class ref,class prt>
struct __list_iterator
{
typedef list_Node<T> node; //将链表类重新命名
typedef __list_iterator<T, ref ,prt> iterator; //迭代器类重新命名
__list_iterator(node* node)
:_node(node)
{
}
//迭代器的解引用
ref operator*()
{
return _node->_data;
}
prt operator->()
{
//重载-> 是因为 在使用list访问 data的时候,会出现 lt -> -> _data 的情况
//所以返回解引用后的地址
return &(operator*());
}
bool operator==(const iterator& it)const
{
return _node== it._node;
}
bool operator!=(const iterator& it)const
{
return _node!=it._node;
}
iterator& operator+&