zoukankan      html  css  js  c++  java
  • queue源码

    queue概述

    queue是一种先进先出的数据结构,允许新增元素、移除元素,queue只允许从底端加入元素,从顶端移除元素,不允许有遍历行为。

    queue定义

    以某种既有容器作为底部结构,将其接口改变,使之符合"先进先出"的特性,形成一个queue,是很容易做到的,deque是双向开口的数据结构,若以deque以底端的出口以及前端的入口,便轻易举起形成一个queue。

    由于queue系以底部容器完成其所有工作,而具有这种性质,称为adapter(配接器),因此,STL stack往往不被归类为container(容器),而被归类为container adapter。

    template <class T,class Sequence=deque<T> >
    class queue
    {
        friend bool operator==__STL_NULL_TMPL_ARGS(const queue& x,const queue& y);
        friend bool operator<__STL_NULL_TMPL_ARGS(const queue& x,const queue& y);    
    public:
        typedef typename Sequence::value_type value_type;
        typedef typename Sequence::size_type size_type;
        typedef typename Sequence::reference reference;
        typedef typename Sequence::const_reference const_reference;
    protected:
        Sequence c;//底层容器
    public:
        //以下利用Sequence(也就是deque)实现queue
        bool empty() const{return c.empty();}
        size_type size() const{return c.size();}
        reference front() const{return c.font();}
        const_reference front() const{return c.font();}
        reference back() const{return c.back();}
        const_reference back() const{return c.back();}
        
        void push(const value_type&){c.push_back(x);}
        void pop(){c.pop_front();}
    };
    
    template <class T,class Sequence>
    bool operator ==(const queue<T,Sequence>& x,const queue<T,Sequence>& y){
        return x.c==y.c;
    }
    
    template <class T,class Sequence>
    bool operator <(const queue<T,Sequence>& x,const queue<T,Sequence>& y){
        return x.c<y.c;
    }

    queue没有迭代器

    queue是先进先出的数据结构,不允许遍历,所以queue不提供迭代器。

    以list作为queue底层容器

    除了deque之外,list也是双向开口的数据结构。上述queue源码中使用的底层容器的函数有empty、size、back、push_back、pop_back,list也都具备,因此,若以list为底部结构并封闭其头端开口,一样能够形成一个stack,示范如下:

    #include<bits/stdc++.h>
    using namespace std;
    
    int main(){
        queue<int,list<int> > myqueue;
        myqueue.push(1);
        myqueue.push(3);
        myqueue.push(5);
        myqueue.push(7);
        cout<<myqueue.size()<<endl; //4
        cout<<myqueue.front()<<endl; //1;
        myqueue.pop(); cout<<myqueue.front()<<endl; //3
        myqueue.pop(); cout<<myqueue.front()<<endl; //5
        myqueue.pop(); cout<<myqueue.front()<<endl; //7
        cout<<myqueue.size()<<endl; //1
        return 0;
    }
  • 相关阅读:
    组合
    面向对象初识, 类名,对象的的使用, 类名称空间和对象名称空间
    内置函数2 递归函数
    内置函数~~~
    生成器 列表推导式 列表表达式
    函数名应用 闭包 迭代器
    函数 动态参数, 名称空间 作用域 取值顺序,函数的嵌套
    函数初识~~
    文件操作要点
    Mysql索引原理
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/10304268.html
Copyright © 2011-2022 走看看