C++ STL之队列的使用及模拟实现

发布时间:2024年01月23日


1. 介绍

  1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。

  2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。

  3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:
    empty:检测队列是否为空
    size:返回队列中有效元素的个数
    front:返回队头元素的引用
    back:返回队尾元素的引用
    push_back:在队列尾部入队列
    pop_front:在队列头部出队列

  4. 标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。

图示:
在这里插入图片描述

想要具体了解其底层数据结构可以参照:栈和队列

2. 队列的使用

函数名称代码功能说明
emptybool empty() const;返回队列是否为空。
sizesize_type size() const;返回队列中元素个数。
frontvalue_type& front();
const value_type& front() const;
返回队头顶元素的引用。
backvalue_type& back();
const value_type& back() const;
返回队尾元素的引用。
pushvoid push (const value_type& val);在队列末尾插入一个新的元素 val。
popvoid pop();删除队头元素。
swapvoid swap (queue& x) noexcept;用于和另一个容器适配器 x 交换内容。

queue的遍历

#include <iostream>
#include <queue>
using namespace std;

int main()
{
    queue<int> qu;
    for (int i = 0; i < 10; ++i)
        qu.push(i);
    while (!qu.empty())
    {
        cout << qu.front() << " " << qu.back() << endl; // 队头元素 队尾元素
        qu.pop();
    }
    return 0;
}

运行结果:
在这里插入图片描述

说明:

  1. 创建了一个名为 qu 的整型队列对象。
  2. 循环迭代,将当前的数字 0 到 9 依次入队。
  3. 循环条件检查栈是否为空。只要队列不为空,就打印队头元素、空格和队尾元素,并且换行,然后删除队头元素。

3. 队列的模拟实现

#pragma once
#include<iostream>
#include<deque>
using namespace std;

namespace my_queue
{
    template<class T, class Con = deque<T>>
    class queue
    {
    public:
        queue()
        {}

        void push(const T& x)
        {
            _c.push_back(x);
        }

        void pop()
        {
            _c.pop_front();
        }

        T& back()
        {
            return _c.back();
        }

        const T& back()const
        {
            return _c.back();
        }

        T& front()
        {
            return _c.front();
        }

        const T& front()const
        {
            return _c.front();
        }
        size_t size()const
        {
            return _c.size();
        }

        bool empty()const
        {
            return _c.empty();
        }
    private:
        Con _c;
    };
}
文章来源:https://blog.csdn.net/czh1592272237/article/details/135790550
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。