C++模板类实现std::list

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值