// <queue>
template < class T, class Container = deque<T> > class queue;

队列(Queue)是一个容器适配器(Container adaptor)类型,被特别设计用来运行于FIFO(First-in first-out)场景,在该场景中,只能从容器一端添加(Insert)元素,而在另一端提取(Extract)元素。

  • T

    容器所包含的元素的类型。

    在类模板内部,使用其别名为 value_type 的成员类型。

    Container

    底层的用于存储元素的容器的类型。

  • queue 通常被实现为容器适配器,即使用一个特定容器类的封装对象作为它的底层容器。queue 提供了一系列成员函数用于操作它的元素,只能从容器“后面”压进(Push)元素,从容器“前面”提取(Pop)元素。

    用来实现队列的底层容器必须满足顺序容器的所有必要条件。同时,它还必须提供以下语义的成员函数:

    • front()
    • back()
    • push_back()​
    • pop_front()

    满足上述条件的标准容器有 std::dequestd::list,如果未特别指定 queue 的底层容器,标准容器 std::deque 将被使用。

    Any sequence container supporting operations front(), back(), push_back() and pop_front() can be used to instantiate queue. In particular, list and deque can be used.

    C++编程语言国际标准:ISO/IEC 14882:2011

  • 成员类型 定义
    value_type 第一个模板参数 T
    container_type 第二个模板参数 Container
    size_type Container::size_type
    reference Container::reference
    const_reference Container::const_reference
  • (constructor) 创建 queue
    (destructor) 释放 queue
    operator= 赋值操作

    Element access:

    front 访问第一个元素
    back 访问最后一个元素

    Capacity:

    empty 判断是否为空
    size 返回有效元素个数

    Modifiers:

    push 在容器顶部插入元素
    pop 移除容器顶部的元素
    emplace C++11 在容器顶部放置插入元素
    swap 交换容器的内容
  • operator==、operator!=、operator<、operator<=、operator>、operator>= 

    关系操作符
    std::swap 交换两个队列的内容
  • 综合 1

    下面这个例子简单地介绍了 queue 的常用使用方法:

    #include <iostream>
    #include <queue>
    
    namespace ClassFoo {
    void QueueExample1() {
        std::queue<int> foo1;
    
        std::cout << "foo1.empty():" << std::boolalpha 
            << foo1.empty() << std::endl;
    
        // 逐个压入元素
        std::cout << "压入四个元素:" << std::endl;
        foo1.push(1);
        std::cout << foo1.back() << " ";
        foo1.push(2);
        std::cout << foo1.back() << " ";
        foo1.push(3);
        std::cout << foo1.back() << " ";
        foo1.push(4);
        std::cout << foo1.back() << " " << std::endl;
    
        std::cout << "foo1.empty():" << std::boolalpha 
            << foo1.empty() << std::endl;
        std::cout << "foo1.size():"
            << foo1.size() << std::endl;
    
        // 逐个弹出元素
        std::cout << "弹出四个元素:" << std::endl;
        std::cout << foo1.front() << " ";
        foo1.pop();
        std::cout << foo1.front() << " ";
        foo1.pop();
        std::cout << foo1.front() << " ";
        foo1.pop();
        std::cout << foo1.front() << " " << std::endl;
        foo1.pop();
    
        std::cout << "foo1.empty():" << std::boolalpha 
            << foo1.empty() << std::endl;
        std::cout << "foo1.size():"
            << foo1.size() << std::endl;
    }
    }
    int main ()
    {
        ClassFoo::QueueExample1();
        return 0;
    }

    输出

    foo1.empty():true
    压入四个元素:
    1 2 3 4 
    foo1.empty():false
    foo1.size():4
    弹出四个元素:
    1 2 3 4 
    foo1.empty():true
    foo1.size():0​