美文网首页cocos2d-Lua
模板及模板队列

模板及模板队列

作者: 最怕认真 | 来源:发表于2016-05-04 17:28 被阅读106次

    c++这个东西还是要多用,不然过段时间又该忘了~,在c++中模板是用来提升编程效率的,尤其在数据结构方面,用的很多,比如栈,队列,等等,对于元素的操作是固定的,但是元素的类型是多样的,模板的存在杜绝了每种类型都要去写对应的代码。

    • 定义一个模板类

    template <class T>
    class Queue
    {
    ....
    }
    

    一般定义模板类的时候,只需要在正常的定义之前加上一个template <class T> 这里的T便是以后要用到的类型了,可以是int,float等等

    • 队列

    队列在事件消息中用的很多,是一种先进先出的数据结构,其实没任何技术含量~~,一般队列的实现都是定义一个结构体,其中包含了两个字段

        template <class N>
        struct Node
        {
            Node<N> * next;
            N ele;
        };
    
    • next:指向下一个节点
    • ele:储存的元素
      这里可以看到,Node这个结构体也是用模板来定义了,有没有发现Queue是定义了T,这里定义了N?主要是为了将两者区分开来,说到这里,就要介绍下,怎么使用模板类了
      Queue<int> queue;
      其中int就是T了,之后在Queue类中所有的T就都是int的意思了,再来看Queue的代码
    template <class T>
    class Queue
    {
    private:
        template <class N>
        struct Node
        {
            Node<N> * next;
            N ele;
        };
        int _len;
        Node<T> * head;
        Node<T> * tail;
    public:
        
        Queue():_len(0)
        {
            head = tail = new Node<T>();
            head->next = NULL;
        }
    
        ~Queue()
        {
            while(head->next)
            {
                Node<T> * node = head;
                head = head->next;
                delete node;
            }
            delete head;
        }
    
        void push(T ele)
        {
            if(_len == 0 )
            {
                head->ele = ele;
                _len++;
                return;
            }
            _len++;
            Node<T> * node = new Node<T>();
            node->ele = ele;
            node->next = NULL;
            tail->next = node;
            tail = node;
        }
    
        T pop()
        {
            _len--;
            if(_len < 0 )
                return NULL;
            Node<T> * node = head;
            head = head->next;
            node->next = NULL;
            return node->ele;
        }
    
        int getLength()
        {
            return _len;
        }
    
        bool isNull()
        {
            return 0 == _len;
        }
    };
    

    在定义head,tail的时候,用T来初始化了Node,而之前我们用int来初始化的T,所以N也变成了int。
    队列的操作很简单,无法入队列(push),出队列(pop),其中pop需要注意下不要为空的时候还去pop,其中要做下判断,还有一点需要注意的是,因为所有的Node都是通过new的方式申请的,所以在析构的时候要将所有的内存释放。

    相关文章

      网友评论

        本文标题:模板及模板队列

        本文链接:https://www.haomeiwen.com/subject/kanrrttx.html