3.1 C++ STL 双向队列容器
双向队列容器(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()
函数向队列的末尾和首部分别添加了两个元素11
和12
。接着,使用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;
}
3.1 C++ STL 双向队列容器的更多相关文章
- HDU--杭电--3415--Max Sum of Max-K-sub-sequence--队列--双向队列
Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- STL之deque双向队列
deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,提供随机访问,deque在接口上和vector非常相似,下面列出deque的常用成员函数: Table 6.9. C ...
- C++STL之双端队列容器
C++STL之双端队列容器 deque双端队列容器与vector很类似,采用线性表顺序存储结构.但与vector区别,deque采用分块的线性存储结构来存储数据,每块的大小一般为512B,将之称为de ...
- STL --> deque双向队列
deque简介 deque是双向开口的连续性存储空间.虽说是连续性存储空间,但这种连续性只是表面上的,实际上它的内存是动态分配的,它在堆上分配了一块一块的动态储存区,每一块动态存储去本身是连续的,de ...
- java-Enumeration,单向队列Queue及双向队列Deque等容器简单使用
1.Enumeration容器使用: package com.etc; import java.util.Enumeration; import java.util.Vector; /* Enumer ...
- [C++STL教程]2.queue队列容器,小白都能看懂的讲解!
在学习数据结构的时候我们会听到这样一个词:队列. 本文将介绍STL中的队列:queue 本文仅从入门和实用角度介绍queue的用法,主要针对初学者或竞赛向.如有不严谨的地方欢迎指正!本文长度约2000 ...
- stl中双向队列用法
双向队列的操作如下: d[i]:返回d中下标为I的元素的引用. d.front():返回的一个元素的引用. d.back():返回最后一个元素的引用. d.pop_back():删除尾部的元素.不返回 ...
- 双向队列 STL
题目描述 想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首:两头都可以做出队,入队的操作.现在给你一系列的操作,请输出最后队列的状态:命令格式:LIN X X表示一个整数,命 ...
- STL之deque(双向队列)
deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,deque在接口上和vector非常相似,下面列出deque的常用成员函数: deque在vector函数的基础上增 ...
- STL之双向队列(dequeue)
//双向队列 deque #include <deque> #include <cstdio> #include <algorithm> using namespa ...
随机推荐
- Codeforces Round #700 (Div. 2) A ~ D1个人题解
Codeforces Round #700 (Div. 2) 比赛链接: Click Here 1480A. Yet Another String Game 因为Alice是要追求小,Bob追求大值, ...
- linux服务器之间免密登录
目标 192.168.0.10 免密登录 192.168.0.11.192.168.0.12两台服务器 1.登录192.168.0.10 生成ssh密钥 ssh-keygen -t r ...
- 【QtJson】用Qt自带的QJson,直接一步到位封装和解析一个类的实例对象!
之前貌似没有看过类似的代码 我们现在的要求就是直接在不知道类成员的情况下,把一个类丢进去就能生成一个Json字符串,也可以把一个字符串和一个类成员丢进去就能根据成员变量名匹配到元素并赋值,大概就这样 ...
- plsql打开报错:Control 'dxDockBrowserPanel' has no parent window问题解决
一.现象: 使用plsql登陆oracle数据库时,登陆信息没有报错,但是最后一步报错,重启电脑依然没有解决 一直报:" Control 'dxDockBrowserPanel' has n ...
- com.alibaba.fastjson.JSONException: create instance error
很早之前在使用FashJson进行实体类转化的时候,如果json参数是多层都是一层对应一个单独的实体类, 今天在项目中想,使用内部类是不是也可以实现,且使用内部类封装性更好.当将json串使用fast ...
- arthas 使用总结
本文为博主原创,未经允许不得转载: Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱.在线排查问题,无需重启:动态跟踪Java代码:实时监控JVM状态. Github: https ...
- 文件传输中的MD5校验技术
1. 文件的MD5校验简介 文件的MD5校验是一种常用的文件完整性验证方法.MD5(Message Digest Algorithm 5)是一种广泛应用的哈希算法,它能够将任意长度的数据转换为固定长度 ...
- TLS 加密套件的学习与了解
TLS 加密套件的学习与了解 加密套件 什么是加密套件? 加密套件是用于在SSL / TLS握手期间协商安全设置的算法的组合. 在ClientHello和ServerHello消息交换之后,客户端发送 ...
- [转帖]Nacos使用2.0.1版本启动出现9848端口错误的解决方式(亲测有效)
目录 一.背景 二.报错如下 三.报错原因 四.解决方式 一.背景 nacos服务端和客户端都是 2.x版本. centos7使用原始安装nacos单机版,没有使用docker安装naocs集群. 二 ...
- [转帖]jmeter学习笔记(二十二)——监听器插件之jp@gc系列
一.jp@gc - Actiive Threads Over Time 不同时间活动用户数量展示 下面是一个阶梯加压测试的图标 二.jp@gc - Transactions per Second ...