STL学习 - queue了解

Queue是STL中的队列表示。

  • 特点是先进先出(First In First Output FIFO)。
  • 允许的操作是新增元素,移除元素,从最底端添加元素,从最顶端获取元素,除了从底端加入元素,从顶端取出外,没有任何其它方法可以存取queue的其他元素,也就是说queue不允许有遍历行为。
  • 把元素推入queue的操作为push, 将元素推出queue的操作为pop.
  • 由于queue系以底部容器完成其所有工作,而具有这种“修改某物接口,形成另外一种风貌”的性质的,称为adapter(容器),因此,STL queue往往不被归类为container(容器),而被称为 container adapter.
  • queue的底层容器的函数有empty, size, front, back, push_front, push_back, pop_front, pop_back。所以假如用list为底部容器,封闭某些接口,能很轻易的行程一个queue。

下面是queue的部分源码,可以从里面看下queue的一些实现和方法定义。

我在看侯捷的STL源码解析的时候,里面说其实queue的方法简单,把list的一些接口给封掉,就可以轻松的实现queue的。具体用list实现的代码,可以看《STL源码剖析》这本书。

/*
    queue synopsis

namespace std
{

template <class T, class Container = deque<T>>
class queue
{
public:
    typedef Container                                container_type;
    typedef typename container_type::value_type      value_type;
    typedef typename container_type::reference       reference;
    typedef typename container_type::const_reference const_reference;
    typedef typename container_type::size_type       size_type;

protected:
    container_type c;

public:
    queue() = default;
    ~queue() = default;

    queue(const queue& q) = default;
    queue(queue&& q) = default;

    queue& operator=(const queue& q) = default;
    queue& operator=(queue&& q) = default;

    explicit queue(const container_type& c);
    explicit queue(container_type&& c)
    template <class Alloc>
        explicit queue(const Alloc& a);
    template <class Alloc>
        queue(const container_type& c, const Alloc& a);
    template <class Alloc>
        queue(container_type&& c, const Alloc& a);
    template <class Alloc>
        queue(const queue& q, const Alloc& a);
    template <class Alloc>
        queue(queue&& q, const Alloc& a);

    bool      empty() const;
    size_type size() const;

    reference       front();
    const_reference front() const;
    reference       back();
    const_reference back() const;

    void push(const value_type& v);
    void push(value_type&& v);
    template <class... Args> void emplace(Args&&... args);
    void pop();

    void swap(queue& q) noexcept(noexcept(swap(c, q.c)));
};

template <class T, class Container>
  bool operator==(const queue<T, Container>& x,const queue<T, Container>& y);

template <class T, class Container>
  bool operator< (const queue<T, Container>& x,const queue<T, Container>& y);

template <class T, class Container>
  bool operator!=(const queue<T, Container>& x,const queue<T, Container>& y);

template <class T, class Container>
  bool operator> (const queue<T, Container>& x,const queue<T, Container>& y);

template <class T, class Container>
  bool operator>=(const queue<T, Container>& x,const queue<T, Container>& y);

template <class T, class Container>
  bool operator<=(const queue<T, Container>& x,const queue<T, Container>& y);

template <class T, class Container>
  void swap(queue<T, Container>& x, queue<T, Container>& y)
  noexcept(noexcept(x.swap(y)));

template <class T, class Container = vector<T>,
          class Compare = less<typename Container::value_type>>
class priority_queue
{
public:
    typedef Container                                container_type;
    typedef typename container_type::value_type      value_type;
    typedef typename container_type::reference       reference;
    typedef typename container_type::const_reference const_reference;
    typedef typename container_type::size_type       size_type;

protected:
    container_type c;
    Compare comp;

public:
    priority_queue() = default;
    ~priority_queue() = default;

    priority_queue(const priority_queue& q) = default;
    priority_queue(priority_queue&& q) = default;

    priority_queue& operator=(const priority_queue& q) = default;
    priority_queue& operator=(priority_queue&& q) = default;

    explicit priority_queue(const Compare& comp);
    priority_queue(const Compare& comp, const container_type& c);
    explicit priority_queue(const Compare& comp, container_type&& c);
    template <class InputIterator>
        priority_queue(InputIterator first, InputIterator last,
                       const Compare& comp = Compare());
    template <class InputIterator>
        priority_queue(InputIterator first, InputIterator last,
                       const Compare& comp, const container_type& c);
    template <class InputIterator>
        priority_queue(InputIterator first, InputIterator last,
                       const Compare& comp, container_type&& c);
    template <class Alloc>
        explicit priority_queue(const Alloc& a);
    template <class Alloc>
        priority_queue(const Compare& comp, const Alloc& a);
    template <class Alloc>
        priority_queue(const Compare& comp, const container_type& c,
                       const Alloc& a);
    template <class Alloc>
        priority_queue(const Compare& comp, container_type&& c,
                       const Alloc& a);
    template <class Alloc>
        priority_queue(const priority_queue& q, const Alloc& a);
    template <class Alloc>
        priority_queue(priority_queue&& q, const Alloc& a);

    bool            empty() const;
    size_type       size() const;
    const_reference top() const;

    void push(const value_type& v);
    void push(value_type&& v);
    template <class... Args> void emplace(Args&&... args);
    void pop();

    void swap(priority_queue& q)
        noexcept(noexcept(swap(c, q.c)) && noexcept(swap(comp.q.comp)));
};

template <class T, class Container, class Compare>
  void swap(priority_queue<T, Container, Compare>& x,
            priority_queue<T, Container, Compare>& y)
            noexcept(noexcept(x.swap(y)));

}  // std

*/
时间: 2024-12-21 00:49:31

STL学习 - queue了解的相关文章

C++ STL学习——queue

我们在上一篇博客中<C++ STL学习--stack>简单介绍了STL 中stack这种数据结构的使用,这篇博客主要来讲一下queue队列的使用.其实queue的使用和stack一样简单.示例代码上传至 https://github.com/chenyufeng1991/STL_queue . (1)首先要引入头文件  #include <queue> . 并使用命名空间  using namespace std; (2)同stack一样,queue也不能使用迭代器.因为queue

C++ STL学习 queue

本文修改自http://www.cnblogs.com/hdk1993/p/5809180.html 1.使用queue需要声明头文件#include <queue> 2.queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型. 3.queue 的基本操作有:入队,如例:que.push(x); 将x 接到队列的末端.出队,如例:que.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值.访问队首元素,如例:

STL学习——Stack/Queue篇

STL学习--Stack/Queue篇 Stack 概述 stack是一种先进先出的数据结构,只有一个出口,stack允许新增元素,移除元素,取得最顶端元素.但除了最顶端外,没有任何办法可以存取stack其他元素.即不允许遍历行为. 实现 stack实现是以容器为底部结构的,将容器的接口改变,使其符合"先进先出"特性,便形成了一个栈.具体实现可以将底部deque的头端开口封闭,便实现了stack.因为stack具有"修改某物接口,形成另一种风貌"性质,故称为&quo

stl容器学习——queue,stack,list与string

目录 string stack queue list 点击上面的内容可以实现跳转哦 简介:本文记录了对string list queue stack四个容器的学习总结,包含有四种容器常用的函数介绍和一些使用过程中碰到的细节总结,在list容器中介绍了迭代器的使用. 头文件 想要用哪一种容器,就要加上对应的头文件 比如想要使用queue , 就要加上 #include<queue> 以此类推,想要使用STL库中的容器,只要加上它们的头文件就好. string 目录部分 1.string的定义及初

STL学习_配接器篇

STL学习_配接器篇 定义 配接器(Adapter)在STL组件的灵活组合运用功能上,扮演着轴承.转换器的角色.它事实上是一种设计模式.即将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes,可以一起运作. 分类 STL所提供的各种适配器中,改变仿函数(functors)接口者,称为function adapter:改变容器(containers)接口者,称为container adapter:改变迭代器(iterators)接口者,称为iterato

STL学习——Priority_queue篇

STL学习--Priority_queue篇 概述 priority_queue是一个拥有权值观念的queue,它允许加入新元素,移除旧元素,审视元素值等功能.因为它是queue,故只允许底端加入元素,顶端取出元素.priorit_queue内元素并非依照被推入的次序排列,而是依照元素权值排列.权值最高者,排在最前面. 实现 priority_queue利用max_heap和vector表现的完全二叉树实现.它的实现完全以底部容器为根据,并使用heap处理规则,故实现简单.默认情况,使用vect

STL 之 queue、priority_queue 源码剖析

/* * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all c

STL之Queue(Q)

STL的Queue(数据结构中的队列): 特点:FIFO 先进先出: 自适应容器(即容器适配器)   栈适配器STL queue  STL中实现的Queue: 用list来实现queue: queue<int, list<int> >  q; 用deque来实现queue: queue<int, deque<int> > q; 不能用vector来实现queue: STL中Queue实现的方法(6种): q.empty(); q.size(); q.fron

标准模板库(STL)学习探究之vector容器

标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector>构造函数. Vectors 包含着一系列连续存储的元素,其行为和数组类