list
是C++ STL
中的一个容器,是一个双向链表,可以存储任意类型的元素。list
中的元素可以通过指针在链表中进行高效的插入和删除操作,因此list
通常被用于需要频繁进行插入和删除操作的场合。
为了区别于库中的list
类,我们可以在自己的命名空间中定义list
类。list
的基本成员变量只有一个——list
的头结点(head
)并且头节点内不存储有效数据。
定义结点结构:
namespace dianxia
{
//定义结点结构
template<class T>
struct ListNode
{
struct ListNode<T>* _next; // 指向下一个结点
struct ListNode<T>* _prev; // 指向前一个结点
T _data; // 结点存储的数据
ListNode(const T& data = T()) // 构造函数 // 申请一个节点
:_next(nullptr),
_prev(nullptr),
_data(data)
{}
};
}
迭代器——作为list
最精华的部分,有着及其重要的作用,且同样为list
模拟实现中最难的一部分。通过本章的内容,我们对于迭代器的理解会更上一层楼!
在string
与vector
的学习中,我们经常使用下标+[]
来访问容器的元素,非常方便。但是到了list
以后的内容,[]
访问元素的方法将不再适用,我们将使用迭代器。
前面的文章中曾经简单的提到过迭代器,简单来说它是一种泛型指针却又不单纯是指针,接下来我们就模拟实现list
的迭代器。
迭代器本质就是对指针的封装模拟指针的行为,所以我们需要通过运算符重载来模拟实现指针的
++
、--
以及*
、->
等操作。
我们将迭代器可以实现的一系列操作封装成类:
// 三个参数的含义分别为:
//类型T
//类型T的引用
//类型T的指针
template<class T,class Ref,class Ptr>
struct _list_iterator
{
typedef ListNode<T> Node;
typedef _list_iterator<T, Ref, Ptr> self;
Node* _node; //迭代器的基本成员变量
_list_iterator(node* node)
:_node(node)
{}
self& operator++()
{
_node = _node->_next;
return *this;
}
self operator++(int)
{
self tmp(*this);
_node = _node->_next;
return tmp;
}
self& operator--()
{
_node = _node->_prev;
return *this;
}
self operator--(int)
{
self tmp(*this);
_node = _node->_prev;
return tmp;
}
Ref& operator*()
{
return _node->_data;
}
Ptr& operator->()
{
return &(_node->_data);
}
bool operator==(const self& s)
{
return _node == s._node;
}
bool operator!=(const self& s)
{
return _node != s._node;
}
}
有了list
的节点和list
的迭代器,下面我们就来是实现list
类本身的成员函数:
template<class T>
class list
{
typedef ListNode<T> Node;
public:
// 类型重命名——普通迭代器
typedef _list_iterator<T,T&,T*> iterator;
// 类型重命名——const迭代器
typedef _list_iterator<T, const T&,const T*> const_iterator;
private:
Node _node;
}
//构造函数
list()
{
_head = new Node;
_head->_next = _head;
_head->_prev = _head;
}
//析构函数
~list()
{
clean();
delete _head;
_head = nullptr;
}
iterator begin()
{
return iterator(_head->_next);
}
iterator end()
{
return iterator(_head);
}
const_iterator begin() const
{
return const_iterator(_head->_next);
}
const_iterator end() const
{
return const_iterator(_head);
}
//插入操作
void insert(iterator pos,const T& data)
{
node* newNode = new Node(data);
Node* cur = pos._node;
Node* prev = cur->_prev;
newNode->_prev = prev;
prev->_next = newNode;
newNode->_next = cur;
cur->_prev=newNode;
}
//删除操作
iterator erase(iterator pos)
{
assert(pos != end());
Node* prev = pos._node->_prev;
Node * next = pos._node->_next;
prev->_next = next;
next->_prev = prev;
delete pos._node;
// 返回删除位置的下一个迭代器位置
return iterator(next);
}
//尾插
void push_back(const T& data)
{
insert(end(),data);
}
//尾删
void pop_back()
{
erase(--end());
}
//头插
void push_front(const T& data)
{
insert(begin(), data);
}
//头删
void pop_front()
{
erase(begin());
}
//清空list
void clean()
{
iterator it = begin();
while (it != end())
{
//it = erase(it);
erase(it++);
}
}
void swap(list<T>& tmp)
{
std::swap(_head, tmp._head);
}
//拷贝构造
list(const list<T>& lt)
{
//初始化
_head = new node;
_head->_next = _head;
_head->_prev = _head;
//复用区间构造
list<T> tmp(lt.begin(), lt.end());
swap(tmp);
}
void swap(list<T>& tmp)
{
std::swap(_head, tmp._head);
}
//赋值重载
list<T>& operator=(list<T> lt)
{
swap(lt);
return *this;
}
#include
#include
using namespace std;
namespace dianxia
{
//定义list节点
template<class T>
struct ListNode
{
struct ListNode<T>* _next; // 指向下一个结点
struct ListNode<T>* _prev; // 指向前一个结点
T _data; // 结点存储的数据
ListNode(const T& data = T()) // 构造函数 // 申请一个节点
:_next(nullptr),
_prev(nullptr),
_data(data)
{}
};
//迭代器的定义
// 三个参数的含义分别为--数据类型T--T的引用--T的指针
template<class T, class Ref, class Ptr>
struct _list_iterator
{
typedef ListNode<T> node;
typedef _list_iterator<T, Ref, Ptr> self;
node* _node;
_list_iterator(node* node)
:_node(node)
{}
self& operator++()
{
_node = _node->_next;
return *this;
}
self operator++(int)
{
self tmp(*this);
_node = _node->_next;
return tmp;
}
self& operator--()
{
_node = _node->_prev;
return *this;
}
self operator--(int)
{
self tmp(*this);
_node = _node->_prev;
return tmp;
}
Ref& operator*()
{
return _node->_data;
}
Ptr& operator->()
{
return &(_node->_data);
}
bool operator==(const self& s)
{
return _node == s._node;
}
bool operator!=(const self& s)
{
return _node != s._node;
}
};
// list类的定义
template<class T>
class list
{
typedef ListNode<T> node;
public:
typedef _list_iterator<T, T&, T*> iterator;
typedef _list_iterator<T, const T&, const T*> const_iterator;
list()
{
_head = new node;
_head->_next = _head;
_head->_prev = _head;
}
// 迭代器区间构造
template<class Iterator>
list(Iterator begin, Iterator end)
{
//初始化
_head = new node;
_head->_next = _head;
_head->_prev = _head;
while (begin != end)
{
push_back(*begin);
++begin;
}
}
void swap(list<T>& tmp)
{
std::swap(_head, tmp._head);
}
//拷贝构造
list(const list<T>& lt)
{
//初始化
_head = new node;
_head->_next = _head;
_head->_prev = _head;
//复用区间构造
list<T> tmp(lt.begin(), lt.end());
swap(tmp);
}
//赋值重载
list<T>& operator=(list<T> lt)
{
swap(lt);
return *this;
}
~list()
{
clean();
delete _head;
_head = nullptr;
}
iterator begin()
{
return iterator(_head->_next);
}
iterator end()
{
return iterator(_head);
}
const_iterator begin() const
{
return const_iterator(_head->_next);
}
const_iterator end() const
{
return const_iterator(_head);
}
void push_back(const T& data)
{
insert(end(),data);
}
void pop_back()
{
erase(--end());
}
void push_front(const T& data)
{
insert(begin(), data);
}
void pop_front()
{
erase(begin());
}
void insert(iterator pos, const T& data)
{
node* newNode = new node(data);
node* cur = pos._node;
node* prev = cur->_prev;
newNode->_prev = prev;
prev->_next = newNode;
newNode->_next = cur;
cur->_prev = newNode;
}
iterator erase(iterator pos)
{
assert(pos != end());
node* prev = pos._node->_prev;
node* next = pos._node->_next;
prev->_next = next;
next->_prev = prev;
delete pos._node;
return iterator(next); // 返回删除位置的下一个迭代器位置
}
void clean()
{
iterator it = begin();
while (it != end())
{
//it = erase(it);
erase(it++);
}
}
private:
node* _head;
};
}
本文到此结束,码文不易,还请多多支持哦!!