3.1 C++ STL 双向队列容器

c++,stl,双向,队列,容器 · 浏览次数 : 23

小编点评

排版方面,本内容没有带排版的内容,因此没有生成排版内容。 内容生成方面,本内容主要包含以下内容: 1. deque双向队列定义与初始化 2. deque双向队列的插入与弹出 3. deque双向队列的反向遍历 4. PrintDeque函数用于输出 deque双向队列的元素 5.示例代码展示如何使用 deque双向队列实现打印元素的功能 内容主要集中在 deque双向队列的定义与操作方面,以及 PrintDeque函数的实现。

正文

双向队列容器(Deque)是C++ STL中的一种数据结构,是一种双端队列,允许在容器的两端进行快速插入和删除操作,可以看作是一种动态数组的扩展,支持随机访问,同时提供了高效的在队列头尾插入和删除元素的操作。

Deque 双向队列容器与Vector非常相似,它不但可以在数组尾部插入和删除元素,还可以在头部进行插入和删除,队列算法的时间复杂度也是常数阶O(1),队列内部的数据机制和性能与Vector不同,一般来说当考虑到容器元素的内存分配策略和操作的性能时,Deque相对于Vector较有优势。

3.1 单向队列的基本操作

这是一段使用STL queue容器的C++代码,展示了如何定义并操作queue队列,包括如何向队列中添加元素、弹出元素、查询队头、队尾信息以及获取队列大小。

在代码中,首先定义了一个queue<int>类型的变量que,这是一个类型为int的队列容器。使用push()函数向队列中加入两个元素1和2。接着,使用while循环,判断队列是否为空,如果不为空,则使用front()back()函数来分别查询队头和队尾元素。最后,使用pop()函数将队头元素出队列。

#include <iostream>
#include <queue>

using namespace std;

int main(int argc, char* argv[])
{
  queue<int> que;

  que.push(1); // 入队列
  que.push(2);

  while (!que.empty())
  {
    cout << "Head: " << que.front() << endl; // 队头
    cout << "End: " << que.back() << endl;   // 队尾
    que.pop(); // 出队列
  }
  cout << "Size: " << que.size() << endl;
  system("pause");
  return 0;
}

3.2 双向队列的基本操作

这是一段使用STL deque容器的C++代码,展示了如何向deque双端队列中插入和弹出元素,以及如何查询和获取双端队列的元素信息。

在代码中,首先定义了一个双端队列deque<int>类型的变量deq,并使用花括号列表初始化的方式插入了10个整数元素。代码使用push_back()push_front()函数向队列的末尾和首部分别添加了两个元素1112。接着,使用pop_back()pop_front()函数分别从队列的末尾和首部弹出了一个元素。

使用empty()函数判断双端队列是否为空,并使用front()back()函数获取队列的首个元素和末尾元素value。同时,使用size()函数获取双端队列的元素个数和max_size()函数获取双端队列最大可容纳的元素数。

#include <iostream>
#include <deque>

using namespace std;

int main(int argc, char* argv[])
{
  deque<int> deq{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

  deq.push_back(11);  // 向队尾放入元素
  deq.push_front(12); // 向队头放入元素

  deq.pop_back();     // 从队尾弹出一个元素
  deq.pop_front();    // 从队头弹出一个元素

  cout << "是否为空: " << deq.empty() << endl;
  cout << "首个元素: " << deq.front() << endl;
  cout << "末尾元素: " << deq.back() << endl;
  cout << "元素个数: " << deq.size() << endl;
  cout << "最大元素数: " << deq.max_size() << endl;

  system("pause");
  return 0;
}

3.3 双向队列正/反向遍历

这是一段使用STL deque容器的C++代码,展示了如何遍历双端队列,并通过迭代器实现正向和反向遍历。

代码使用reverse_iterator类型的迭代器实现了双端队列的反向遍历。由于双端队列底层实现是双向链表,因此支持反向遍历。

最后,代码使用cout输出遍历时访问到的每个元素的值。需要注意的是,在输出时,对于迭代器类型的元素需要通过解引用符(*)来获取其值。

#include <iostream>
#include <deque>

using namespace std;

int main(int argc, char* argv[])
{
  deque<int> deq{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

  // 双向队列的正向遍历: 此处有两种遍历方法
  for (int x = 0; x < deq.size(); x++)    // 第一种,通过下标遍历数据
    cout << deq[x] << " " ;
  cout << endl;

  deque<int>::iterator start, end;        // 第二种,通过迭代器遍历数据
  end = deq.end();
  for (start = deq.begin(); start != end; start++)
    cout << (*start) << " " ;
  cout << endl;

  // 双向队列的反向遍历: 此处我们使用迭代器遍历
  deque<int>::reverse_iterator rstart, rend;
  rend = deq.rend();
  for (rstart = deq.rbegin(); rstart != rend; rstart++)
  {
    cout << (*rstart) << " " ;
  }

  system("pause");
  return 0;
}

3.4 双向队列插入/弹出元素

这是一段使用STL deque容器的C++代码,展示了如何定义并操作deque双端队列,包括插入、弹出和删除元素等操作。代码通过调用pop_front()pop_back()函数从队列的首尾部分别弹出元素。同时,使用erase()函数删除了第二个元素(下标索引为1)。

#include <iostream>
#include <deque>

using namespace std;

int main(int argc, char* argv[])
{
  deque<int> deq{ 1, 2, 3, 4, 5 };

  deq.push_back(6);               // 从队列末尾追加元素
  deq.push_front(0);              // 从队列首部追加元素
  deq.insert(deq.begin() + 1, 9); // 在第二个元素前插入9

  deq.pop_front();                // 从队列首部弹出元素
  deq.pop_back();                 // 从队列尾部弹出元素
  deq.erase(deq.begin() + 1);     // 弹出第二个(下标索引)元素


  for (int x = 0; x < deq.size(); x++)
    cout << deq[x] << " ";
  cout << endl;

  system("pause");
  return 0;
}

3.5 函数参数传递双向队列

该代码展示了如何定义并操作deque双端队列,以及如何通过定义只读迭代器实现遍历输出。

在代码中,首先定义了一个双端队列deque<int>类型的变量deq,并使用花括号列表初始化的方式插入了9个整数元素。

然后,代码定义了一个PrintDeque函数来输出双端队列的元素。这个函数的参数是一个const引用类型的deque<int>对象,表示只读的双端队列。在函数内部,使用了const_iterator类型的迭代器来遍历deque中的所有元素,并依次输出。

接着,代码调用PrintDeque函数,将之前创建的变量deq作为参数传递给这个函数,从而展示了如何遍历输出双端队列的所有元素。

#include <iostream>
#include <deque>
#include <algorithm>

using namespace std;

// 定义只读deque双端队列
void PrintDeque(const deque<int> &deq)
{
  for (deque<int>::const_iterator item = deq.begin(); item != deq.end(); item++)
  {
    // 迭代器类型: iterator=>普通迭代器 reverse_iterator=>逆序迭代器 const_iterator=>只读迭代器
    cout << (*item) << endl;
  }
}

int main(int argc, char* argv[])
{
  deque<int> deq = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  PrintDeque(deq);
  system("pause");
  return 0;
}

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/29f63c41.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

与3.1 C++ STL 双向队列容器相似的内容:

3.1 C++ STL 双向队列容器

双向队列容器(Deque)是C++ STL中的一种数据结构,是一种双端队列,允许在容器的两端进行快速插入和删除操作,可以看作是一种动态数组的扩展,支持随机访问,同时提供了高效的在队列头尾插入和删除元素的操作。Deque 双向队列容器与Vector非常相似,它不但可以在数组尾部插入和删除元素,还可以在头部进行插入和删除,队列算法的时间复杂度也是`常数阶O(1)`,队列内部的数据机制和性能与Vecto

3.1 C/C++ 使用字符与指针

C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。

[转帖]Linux tracing/profiling 基础:符号表、调用栈、perf/bpftrace 示例等(2022)

http://arthurchiao.art/blog/linux-tracing-basis-zh/ 1 引言 1.1 热点与调用栈分析(perf record/report/script) 1.2 符号(symbols) 1.3 小结 2 极简程序 hello-world:探究符号 2.1 C

[转帖]数据中心机房的概念

https://www.cnblogs.com/gered/p/16953396.html 目录 【1】机房等级分类 (1.1)A级为容错型 (1.2)B级为冗余型 (1.3)C级为基本型 二、数据中心机房组成 【3】数据中心机房标准 (3.1)建筑装修 (3.2)供电系统 (3.3)接地、防雷系统

.NET周报 【3月第1期 2023-03-03】

国内文章 我做的FFmpeg开源C#封装库Sdcb.FFmpeg https://www.cnblogs.com/sdflysha/archive/2023/02/27/dotnet-conf-china-2022-ffmpeg.html FFmpeg是知名的音频视频处理软件,我平时工作生活中会经常

Simple Factory 简单工厂模式简介与 C# 示例【创建型3.1】【设计模式来了_3.1】

本文通过简单的实例对简单工厂模式进行了介绍。

C++如何在main函数开始之前(或结束之后)执行一段逻辑?

1. 问题 2. 考察的要点 3. 解决策略 3.1. 方案一:使用GCC的拓展功能 3.2. 方案二:使用全局变量 3.3. 方案三:atexit 4. Demo测试 4.1. 测试代码 4.2. 执行结果 5. 程序异常退出场景 5.1. 存在的问题 5.2. 解决方案 5.2.1. 原理 5.

Boost程序库完全开发指南:1.2-C++基础知识点梳理

主要整理了N多年前(2010年)学习C++的时候开始总结的知识点,好长时间不写C++代码了,现在LLM量化和推理需要重新学习C++编程,看来出来混迟早要还的。 1.const_cast (expression)[1] 解析:const_cast转换符用来移除变量的const或v

C# 8.0 添加和增强的功能【基础篇】

.NET Core 3.x 和 .NET Standard 2.1 支持 C# 8.0。本文对此版本的更新内容做了简单的记录,希望有助于你我的理解。

CUDA C编程权威指南:1.3-CUDA基础知识点梳理

主要整理了N多年前(2013年)学习CUDA的时候开始总结的知识点,好长时间不写CUDA代码了,现在LLM推理需要重新学习CUDA编程,看来出来混迟早要还的。 1.CUDA数组 解析:CUDA数组是使用cudaMallocArray()、cudaMalloc3DArray()分配的,使用cudaFr