C++进阶:模拟实现STL中list容器
C++中list容器提供了双向链表的所有操作,以下代码模拟了其中的部分功能,附有测试用例
list_imitate.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<list>
#include<functional>
using namespace std;
namespace bit
{
template <class T>
class ListIterator;
template <class T>
class list;
//节点类
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()const
{
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 <)
{
return _Ptr != lt._Ptr;
}
bool operator==(const self <)
{
return _Ptr == lt._Ptr;
}
private:
PNode _Ptr;
};
//list类
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);
}
}
list(initializer_list<T> il)
{
CreateHead();
for (const auto &e : il)
push_back(e);
}
template<class _It>
list(_It first,_It last)
{
CreateHead();
while (first != last)
{
push_back(*first);
++first;
}
}
list( list<T> <)
{
CreateHead();
list tmp_list(lt.begin(), lt.end());
swap(tmp_list);
}
~list()
{
clear();
delete _pHead;
_pHead = nullptr;
}
public:
void push_front(const T &x)
{
insert(begin(), x);
}
void push_back(const T &x)
{
insert(end(), x);
}
void pop_front()
{
erase(begin());
}
void pop_back()
{
erase(--end());
}
void swap(list<T> <)
{
std::swap(_pHead ,lt._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);
}
iterator erase(iterator pos)
{
PNode p = pos.Mynode();
PNode q = p->next;
p->next->prev = p->prev;
p->prev->next = p->next;
delete p;
return iterator(q);
}
void erase(iterator first, iterator last)
{
while (first != last)
{
first = erase(first);
}
}
protected:
void CreateHead()
{
_pHead = new ListNode<T>;
_pHead->next = _pHead->prev = _pHead;
}
private:
PNode _pHead;
};
};
int main()
{
bit::list<int> lt1 = { 1,2,3,4,5,6,7,8,9 };
bit::list<int> lt2 = lt1;
//lt2.erase(lt2.begin());
//lt2.pop_front();
//lt2.pop_back();
//lt1.erase(lt1.begin(), lt1.end());
lt1.clear();
auto it = lt1.begin();
while (it != lt1.end())
{
cout << *it << " ";
++it;
}
cout << endl;
/*bit::list<int> lt2 = { 2,3,4,5,6,7,8,9,10};
lt1.swap(lt2);
auto it = lt1.begin();
while (it != lt1.end())
{
cout << *it << " ";
++it;
}
cout << endl;
auto it1 = lt2.begin();
while (it1 != lt2.end())
{
cout << *it1 << " ";
++it1;
}
cout << endl;
lt.push_front(5);
lt.push_front(6);
lt.push_back(2);
lt.push_back(3);
auto it = lt.begin();
while (it != lt.end())
{
cout << *it << " ";
++it;
}
cout << endl;
*/
system("pause");
}