list容器的模拟实现
#include <iostream>
using namespace std;
namespace mylist
{
template<class T>
class list;
template<class T>
class ListIterator;
template<class T>
class ListNode
{
friend class list<T>;
friend class ListIterator<T>;
public:
ListNode(T data = T()) : next(nullptr), prev(nullptr), value(data)
{
}
~ListNode()
{
}
private:
ListNode* next;
ListNode* prev;
T value;
};
template<class T>
class ListIterator
{
public:
typedef ListNode<T>* PNode;
typedef ListIterator<T> self;
public:
ListIterator(PNode _P) : _Ptr(_P)
{
}
PNode mynode()
{
return _Ptr;
}
public:
T operator*() const
{
return _Ptr->value;
}
self& operator++()
{
_Ptr = _Ptr->next;
return *this;
}
self& operator--()
{
_Ptr = _Ptr->prev;
return *this;
}
bool operator!=(const self& lt)
{
return _Ptr != lt._Ptr;
}
bool operator==(const self& lt)
{
return _Ptr == lt._Ptr;
}
private:
PNode _Ptr;
};
template<class T>
class list
{
public:
typedef ListNode<T>* PNode;
typedef ListIterator<T> iterator;
public:
list()
{
CreateHead();
}
list(int n, const T& v = T())
{
CreateHead();
for (int i = 0; i < n; ++i)
{
push_back(v);
}
}
template<class _It>
list(_It first, _It last)
{
CreateHead();
while (first != last)
{
push_back(*first);
++first;
}
}
list(initializer_list<T> il)
{
CreateHead();
for (const auto& e : il)
{
push_back(e);
}
}
list(list<T>& l)
{
CreateHead();
list tmp_list(l.begin(), l.end());
swap(tmp_list);
}
~list()
{
clear();
delete _pHead;
_pHead = nullptr;
}
public:
void push_back(const T& x)
{
insert(end(), x);
}
void push_front(const T& x)
{
insert(begin(), x);
}
void pop_back()
{
erase(--end());
}
void pop_front()
{
erase(begin());
}
void swap(list<T>& l)
{
std::swap(_pHead, l._pHead);
}
void clear()
{
erase(begin(), end());
}
public:
iterator begin()
{
return iterator(_pHead->next);
}
iterator end()
{
return iterator(_pHead);
}
public:
iterator insert(iterator pos, const T & x)
{
PNode s = new ListNode<T>(x);
PNode p = pos.mynode();
s->next = p;
s->prev = p->prev;
s->next->prev = s;
s->prev->next = s;
return iterator(s);
}
void erase(iterator first, iterator last)
{
while (first != last)
{
first = erase(first);
}
}
iterator erase(iterator pos)
{
PNode p = pos.mynode();
PNode q = p->next;
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
return iterator(q);
}
protected:
void CreateHead()
{
_pHead = new ListNode<T>;
_pHead->next = _pHead->prev = _pHead;
}
private:
PNode _pHead;
};
};