首页 > 编程语言 >3.1 C++ STL 双向队列容器

3.1 C++ STL 双向队列容器

时间:2023-08-16 09:22:04浏览次数:37  
标签:deque include STL deq 元素 C++ 队列 3.1 双端

双向队列容器(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 许可协议。转载请注明出处!

标签:deque,include,STL,deq,元素,C++,队列,3.1,双端
From: https://www.cnblogs.com/LyShark/p/17633039.html

相关文章

  • C++ 与 QML 进行交互
    C++调用QML中的函数//main.cpp#include<QGuiApplication>#include<QQmlApplicationEngine>#include<QDebug>intmain(intargc,char*argv[]){QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplicationapp(argc,arg......
  • C++中const修饰符的含义
    const修饰符在C++中的用途主要是四类:1,变量类型声明的修饰:禁止对变量或对象的修改;2,函数形参中的声明修饰:禁止对传递的对象作修改,或禁止对引用变量作修改;3,函数返回类型前的修饰:禁止修改函数返回的对象;4,类成员函数声明(小括号之后、大括号之前)末尾的修饰:禁止该成员函数修改类中的任何......
  • 使用C++界面框架ImGUI开发一个简单程序
    目录简介使用示例下载示例main文件设置ImGui风格设置字体主循环添加Application类中文编码问题界面设计关于imgui_demo.cpp创建停靠空间创建页面隐藏窗口标签栏创建导航页面创建内容页面隐藏控制台窗口打包程序总结待解决问题开发优势附件简介ImGui是一个用于C++的用户界面库,跨......
  • C++ STL iota 使用方法
    C++STLiota用法介绍c++11引入的函数,C++20后小更新使用#include<numeric>头文件引用功能std::iota[aɪ'otə]输入一个值和一个容器的开始地址和结束地址,对该容器进行自增填充。Example点击查看代码#include<numeric>#include<vector>usingnamespacestd;intma......
  • TDengine 3.1.0.0 版本成功发布,涉及五大板块功能更新!
    自3.0版本发布以来,在研发人员和社区用户的不断努力下,时序数据库(TimeSeriesDatabase)TDengine 做了大量更新,产品性能、稳定性和易用性都在不断提升。近期,TDengine3.1.0.0 终于成功发布,下面我们向大家介绍一下这一版涉及到的重大更新。查询性能优化(开源版+企业版)主要优化......
  • chatGPT用C++写的HMAC-SHA256函数
    以下内容全为chatGPT生成:#include<openssl/hmac.h>#include<openssl/sha.h>#include<iostream>#include<iomanip>std::stringhmac_sha256(conststd::string&key,conststd::string&data){unsignedcharhash[SHA256_DIGEST_L......
  • C++简单动态链接库的创建和引用(VS2022)
    原文:https://blog.csdn.net/XianLiangcheese/article/details/127125135总结在前:创建dll:1.打开VS2022,创建一个“动态链接库”新项目2.建立一个需要导出的类3.编辑导出类里面的内容,其中需要在导出的方法,也就是在外面引用的方法,只需要在其类型声明前面加上“__declspec(dllexport)......
  • C++语言常见知识点
    C++基础变量存在的意义是什么?作用:给一段指定的内存空间起名,方便我们管理操作这块内存。inta=10;常量的两种定义方式1、#definePI3.14 2、constinta=10;用于记录程序中不可更改的数据。标识符的命名规则1、不能是关键字2、只能由字母、下划线、数字构成3、不能数字......
  • C++黑马程序员——P228. pair对组
    P228.pair使用——pair对组的创建功能描述:  成对出现的数据,利用对组可以返回两个数据两种创建方式:pair<type,type>p(value1,value2);pair<type,type>p=make_pair(value1,value2);#include<iostream>#include<string>usingnamespacestd;//pair对组创建v......
  • c++初始化方式
    对类型进行初始化时,语法是相当的多,为什么要这么多初始化方法呢?主要是以前各种类型的初始化方式不同,现在演变成如此多的方式就是为了使初始化常规变量的方式与初始化类变量的方式更像。大括号初始化器是后来扩展出的用于任何类型,所以尽量使用大括号初始化语法。1、基本类型初始化......