list是以链表为底层的STL容器,下面用模板类实现它的基本功能,部分思路参考C++泛型STL原理和应用。
list实现的函数:
push_front()
push_back()
pop_front()
pop_back()
begin()
end()
size()
迭代器重载了:
=
==
!=
++
--
*
# include <iostream>
using namespace std;
template<typename T>
class list_node{
public:
list_node<T>* pre;
list_node<T>* nxt;
T val;
};
template<typename T>
class list_iterator{
public:
typedef list_iterator<T> Iterator;
list_iterator():pt(nullptr){}
list_iterator(list_node<T>* x):pt(x){}
Iterator& operator++(){
pt = pt->nxt;
return *this;
}
Iterator& operator++(int){
Iterator tmp = *this;
++*this;
return *this;
}
Iterator& operator--(){
pt = pt->pre;
return *this;
}
Iterator& operator--(int){
Iterator tmp = *this;
--*this;
return this;
}
Iterator& operator=(const Iterator& x){
pt = x.pt;
return *this;
}
T operator*(){
return pt->val;
}
bool operator==(const Iterator& x){
return (pt == x.pt);
}
bool operator!=(const Iterator& x){
return (pt != x.pt);
}
list_node<T>* pt;
};
template<typename T>
class mylist{
public:
typedef list_iterator<T> Iterator;
mylist(){
pt_tail = new list_node<T>;
pt_tail->pre = pt_tail->nxt = pt_tail;
len = 0;
}
~mylist(){}
Iterator begin(){
return pt_tail->nxt;
}
Iterator end(){
return pt_tail;
}
void pop_back(){
erase(--end());
}
void pop_front(){
erase(begin());
}
Iterator insert(const Iterator& p, T x){
list_node<T>* tmp = new list_node<T>;
tmp->val = x;
p.pt->pre->nxt = tmp;
tmp->pre = p.pt->pre;
tmp->nxt = p.pt;
p.pt->pre = tmp;
++len;
return tmp;
}
void erase(Iterator p){
if(len == 0) return;
p.pt->nxt->pre = p.pt->pre;
p.pt->pre->nxt = p.pt->nxt;
delete(p.pt);
--len;
}
void push_back(T x){
insert(end(), x);
}
void push_front(T x){
insert(begin(), x);
}
int size(){
return len;
}
private:
list_node<T>* pt_tail;
int len;
};
int main(){
mylist<int>l;
l.push_back(10);
l.push_back(20);
l.push_front(70);
mylist<int>::Iterator it = l.begin();
for(;it!=l.end(); ++it){
cout << *it << endl;
}
return 0;
}