C++ STL queue(队列)超详版

本文介绍了C++STL中的vector容器和queue数据结构,重点比较了它们的差异,强调vector的动态扩展能力与queue的先进先出特性,以及queue的常见操作如push、pop等。
摘要由CSDN通过智能技术生成

vector 容器是 STL 中最常用的容器之一,它和 array 容器非常类似,都可以看做是对 C++ 普通数组的“升级版”。不同之处在于,array 实现的是静态数组(容量固定的数组),而 vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预。

vector 常被称为向量容器,因为该容器擅长在尾部插入或删除元素,在常量时间内就可以完成,时间复杂度为O(1);而对于在容器头部或者中部插入或删除元素,则花费时间要长一些(移动元素需要耗费时间),时间复杂度为线性阶O(n)。

首先,

在C++中,队列(queue)是一种先进先出(FIFO)的数据结构,可以用来存储和访问数据。C++标准库中提供了队列的实现,可以通过包含头文件#include<queue>来使用。

一、定义

queue是一种容器转换器模板,调用#include< queue>即可使用队列类。
二、queue初始化

queue<Type, Container> (<数据类型,容器类型>)

初始化时必须要有数据类型,容器可省略,省略时则默认为deque 类型
初始化示例

    queue<int>q1;
     
    queue<double>q2;
     
    queue<char>q3;
     
    //默认为用deque容器实现的queue;
     
     
    queue<char, list<char>>q1;
     
    //用list容器实现的queu
     
    queue<int, deque<int>>q2;
     
    //用deque容器实现的queue

    注意:不能用vector容器初始化queue

因为queue转换器要求容器支持front()、back()、push_back()及 pop_front(),说明queue的数据从容器后端入栈而从前端出栈。所以可以使用deque(double-ended queue,双端队列)和list对queue初始化,而vector因其缺少pop_front(),不能用于queue。
二、queue常用函数

1、常用函数
数push() 在队尾插入一个元素

表1如下:
成员函数    功能
empty()    如果 queue 中没有元素的话,返回 true。
size()    返回 queue 中元素的个数。
front()    返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
back()    返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
push(const T& obj)    在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。
emplace()    在 queue 的尾部直接添加一个元素。
push(T&& obj)    以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。
pop()    删除 queue 中的第一个元素。
swap(queue<T> &other_queue)    将两个 queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。

表2如下:
方法    功能
q.empty()    判断队列是否为空
q.size()    返回队列中元素个数
q.front()    返回队列中的第一个元素的引用
q.back()    返回队列最后一个元素的引用
q.push(x)    在队列尾部添加一个元素
q.pop()    删除队列中的第一个元素(至少保证有一个元素)
2、函数运用示例

1)push()在队尾插入一个元素

    queue <string> q;
     
    q.push("first");
     
    q.push("second");
     
    cout<<q.front()<<endl;

    输出 first

2)pop() 将队列中最靠前位置的元素删除,没有返回值

    queue <string> q;
     
    q.push("first");
     
    q.push("second");
     
    q.pop();
     
    cout<<q.front()<<endl;

输出 second 因为 first 已经被pop()函数删掉了

3)size() 返回队列中元素个数

    queue <string> q;
     
    q.push("first");
     
    q.push("second");
     
         cout<<q.size()<<endl;

输出2,因为队列中有两个元素

4)empty() 如果队列空则返回true

    queue <string> q;
     
    cout<<q.empty()<<endl;
     
    q.push("first");
     
    q.push("second");
     
    cout<<q.empty()<<endl;

分别输出1和0
最开始队列为空,返回值为1(ture);
插入两个元素后,队列不为空,返回值为0(false);

示例代码:

    #include <iostream>
    #include <queue>
     
    int main() {
        std::queue<int> myQueue;
     
        // 添加元素到队列尾部
        myQueue.push(10);
        myQueue.push(20);
        myQueue.push(30);
     
        // 访问队列头部元素
        std::cout << "Front element: " << myQueue.front() << std::endl;
     
        // 访问队列尾部元素
        std::cout << "Back element: " << myQueue.back() << std::endl;
     
        // 移除队列头部元素
        myQueue.pop();
     
        // 遍历并打印队列中的元素
        while (!myQueue.empty()) {
            std::cout << myQueue.front() << " ";
            myQueue.pop();
        }
        std::cout << std::endl;
     
        return 0;
    }

输出结果:

    Front element: 10
    Back element: 30
    20 30

简解:

在上述代码中,首先创建了一个名为myQueue的队列,并使用push()函数将元素10、20和30添加到队列的尾部。然后,使用front()函数访问队列的头部元素,使用back()函数访问队列的尾部元素。接着,使用pop()函数移除了队列的头部元素。最后,使用empty()函数判断队列是否为空,并使用front()函数访问队列的头部元素并将其打印出来,然后再使用pop()函数移除队列的头部元素,直到队列为空。

队列的使用非常简单,在实际编程中经常用于解决需要按照先进先出顺序处理数据的问题。

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。
又及:这是改版,原创请看<C++>queue(队列)-CSDN博客

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值