深入掌握STL Queue

STL中的queue是一个标准模板库容器,能够快速有效地存储和处理数据,是日常编程开发中非常常用的数据结构之一。本篇文章将从多个方面对STL queue进行详细的阐述。

一、基本概念

Queue是一种受限的线性结构,遵循先进先出(FIFO)原则。主要有两个关键方法:push()向队尾插入元素、pop()弹出队头元素。

在STL中,queue是一个模板类,包含在头文件中。声明一个queue对象可以使用如下方式:

queue q; //创建一个空的int类型队列

queue默认使用deque作为底层容器进行实现,也可以通过指定另一种STL容器作为底层实现:

queue<int, vector> q; //使用vector作为底层容器实现队列

二、基本操作与属性

1. push()和pop()

队列的最基本操作是push()和pop(),分别是在队列末尾添加一个元素和弹出队头元素。这两个操作都能够在常量时间完成。

queue q;
q.push(1); //队列中添加元素1
q.push(2); //队列中添加元素2
q.pop(); //弹出队列头元素1

2. front()和back()

除了基本操作外,队列还有两个辅助操作。front()返回队列的头元素,back()返回队列的尾元素。它们都在常量时间完成。但需要注意的是,在队列为空的时候使用front()和back()会导致一场,因此使用之前需要先通过empty()方法判断队列是否为空。

queue q;
q.push(1); //在队列末尾插入元素
q.push(2);
cout << q.front() << endl; //输出队列头元素1
cout << q.back() << endl; //输出队列尾元素2

3. empty()和size()

empty()方法用于检查队列是否为空,返回true表示队列为空,false表示队列不为空。size()方法用于返回队列中元素的个数。

queue q;
q.push(1);
q.push(2);
cout << q.empty() << endl; //输出0,队列不为空
cout << q.size() << endl; //输出2,队列中共有两个元素

三、应用场景

1. BFS搜索算法

队列在BFS搜索算法中扮演重要的角色。在BFS算法中,我们从起点开始搜索,遇到规定条件的节点就将其加入队列中,然后依次从队列中弹出节点,扩展其所有可到达的子节点并加入到队列中。如此迭代直到搜索到目标节点或者队列为空。

vector<vector> graph; //图的邻接矩阵,0表示不联通
vector visited(n, false); //节点的访问标记
queue q;
q.push(start);
visited[start] = true;
while(!q.empty()) {
    int cur = q.front();
    q.pop();
    //处理当前节点cur的操作
    for(int i = 0; i < n; i++) {
        if(graph[cur][i] == 1 && !visited[i]) {
            q.push(i);
            visited[i] = true;
        }
    }
}

2. 多线程

在多线程编程过程中,队列可以被用于缓存数据,在多个线程之间进行数据交换和协同工作。例如,一个生产者线程将数据推入到队列中,一个或多个消费者线程则从队列中取出数据并进行处理。

queue q;
mutex m;
condition_variable cv;
//生产者线程
void push(int data) {
    unique_lock lock(m);
    q.push(data); //将数据压入队列中
    cv.notify_one(); //唤醒一个消费者线程
}
//消费者线程
void pop() {
    unique_lock lock(m);
    while(q.empty()) {
        cv.wait(lock); //等待唤醒,防止死锁
    }
    int data = q.front(); //从队列中取出数据
    q.pop(); //弹出队列头元素
    //进行对data的处理
}

3. 最近的K个元素

在某些场合,我们需要求解一个序列中最近的K个元素,这时我们可以使用队列来维护一个大小为K的滑动窗口,每当有新的元素到来时,判断是否可以加入队列,如果可以就将其加入队列尾部并弹出队头的元素。

vector nums; //原始数组
queue q; //维护窗口的队列
int k = 3; //窗口大小为3
for(int i = 0; i = k) { //队列已满
        q.pop(); //弹出队头的元素
    }
    q.push(nums[i]); //将新元素压入队列
    if(q.size() == k) { //队列满足窗口大小
        //进行对q中元素的处理
    }
}

总结

本篇文章从基本概念、基本操作与属性和应用场景三个方面介绍了STL queue的相关知识。熟练掌握STL queue,可以提高程序员编写代码的效率并提高代码可读性。

原创文章,作者:RSDZX,如若转载,请注明出处:https://www.506064.com/n/335034.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
RSDZXRSDZX
上一篇 2025-02-05 13:05
下一篇 2025-02-05 13:05

相关推荐

  • MSVC STL实现

    本文主要介绍Microsoft Visual C++(MSVC)中,标准模板库(STL)的实现及其用法。STL是通用的C++程序库,是C++标准之一。它提供了许多通常需要实现的数据…

    编程 2025-04-28
  • Python queue长度用法介绍

    本文将从多个方面详细阐述Python queue长度问题,包括队列长度的定义、如何获取队列长度、队列满时如何处理以及常见的队列长度问题。同时,本文也会提供完整的Python代码示例…

    编程 2025-04-28
  • 深入解析Vue3 defineExpose

    Vue 3在开发过程中引入了新的API `defineExpose`。在以前的版本中,我们经常使用 `$attrs` 和` $listeners` 实现父组件与子组件之间的通信,但…

    编程 2025-04-25
  • 深入理解byte转int

    一、字节与比特 在讨论byte转int之前,我们需要了解字节和比特的概念。字节是计算机存储单位的一种,通常表示8个比特(bit),即1字节=8比特。比特是计算机中最小的数据单位,是…

    编程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什么是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一个内置小部件,它可以监测数据流(Stream)中数据的变…

    编程 2025-04-25
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25
  • 深入了解scala-maven-plugin

    一、简介 Scala-maven-plugin 是一个创造和管理 Scala 项目的maven插件,它可以自动生成基本项目结构、依赖配置、Scala文件等。使用它可以使我们专注于代…

    编程 2025-04-25
  • 深入了解LaTeX的脚注(latexfootnote)

    一、基本介绍 LaTeX作为一种排版软件,具有各种各样的功能,其中脚注(footnote)是一个十分重要的功能之一。在LaTeX中,脚注是用命令latexfootnote来实现的。…

    编程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一个程序就是一个模块,而一个模块可以引入另一个模块,这样就形成了包。包就是有多个模块组成的一个大模块,也可以看做是一个文件夹。包可以有效地组织代码和数据…

    编程 2025-04-25
  • 深入探讨冯诺依曼原理

    一、原理概述 冯诺依曼原理,又称“存储程序控制原理”,是指计算机的程序和数据都存储在同一个存储器中,并且通过一个统一的总线来传输数据。这个原理的提出,是计算机科学发展中的重大进展,…

    编程 2025-04-25

发表回复

登录后才能评论