deque双端队列容器

deque采用分块的星星存储结构来存储数据,每块的大小一般为512个字节,称为一个deque块,所有的deque块使用一个map块进行管理,每个map数据项纪录各块的首地址。

deque块在头部和尾部都可以插入和删除元素,而不需要移动其他元素(使用push_back()方法在尾部插入元素,会扩张队列;而使用push_back()方法在手部插入元素和使用insert()方法在中间插入元素)。

一般来说,当考虑到容器元素的内存分配策略和操作的性能时,deque相对于vector更具有优势。

使用deuqe需要声明头文件包含“#include<deque>”。


创建deque对象


创建deque对象的方法通常有三种,建立对象的时候可以选择不带参数,带一个参数,两个参数。

(1)创建没有任何元素的deque对象

deque<int> d;
deque<float> dd;


(2)创建具有n个元素的deque对象

deque<int> d(10);   //创建具有10个整形元素的deque对象d


(3)创建具有n个元素的deque对象,并赋初值

deque<float> d(10,2.5);   //创建1具有10个初值为2.5的float型的deque对象d


插入元素


(1)使用push_back()方法从尾部插入元素,会不断扩张队列。

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	d.push_back(1);
	d.push_back(2);
	d.push_back(3);
	cout<<d[0]<<" "<<d[1]<<" "<<d[2]<<endl;
	return 0;
} 
程序输出 1 2 3 
(2)使用push_front()方法从头部插入元素,其他元素向后移动

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	d.push_back(1);
	d.push_back(2);
	d.push_front(3);
	cout<<d[0]<<" "<<d[1]<<" "<<d[2]<<endl;
	return 0;
} 
程序输出 3 1 2
(3)使用insert()方法从中间插入元素,其参数有两个,第一个是迭代器参数,第二个是插入元素的值

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	d.push_back(1);
	d.push_back(2);
	d.push_back(3);
	d.insert(d.begin()+1,10);
	cout<<d[0]<<" "<<d[1]<<" "<<d[2]<<" "<<d[3]<<endl;
	return 0;
} 
程序输出 1 10 2 3


前向遍历


(1)以数组方式遍历

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	d.push_back(1);
	d.push_back(2);
	d.push_back(3);
	for(int i=0;i<3;i++)cout<<d[i]<<" ";
	return 0;
} 

(2)以前向迭代器的方式遍历

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	d.push_back(1);
	d.push_back(2);
	d.push_back(3);
	
	deque<int>::iterator it;
	for(it=d.begin();it<d.end();it++)cout<<*it<<" ";
	return 0;
} 


反向遍历


采用反向迭代器对双端队列容器进行反向遍历

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	d.push_back(1);
	d.push_back(2);
	d.push_back(3);
	
	deque<int>::reverse_iterator rit;
	for(rit=d.rbegin();rit<d.rend();rit++)cout<<*rit<<" ";
	return 0;
} 
输出 3 2 1


删除元素


可以从deque中的首部、尾部、中部删除元素,并可以清空双端队列容器。

(1)采用pop_front()方法从头部删除元素

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	for(int i=1;i<10;i++)
	 d.push_back(i);
	
	d.pop_front();
	d.pop_front();
	 
	deque<int>::iterator it;
	for(it=d.begin();it<d.end();it++)cout<<*it<<" ";
	return 0;
} 

输出 3 4 5 6 7 8 9

(2)采用pop_back()方法从尾部删除元素

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	for(int i=1;i<10;i++)
	 d.push_back(i);
	
	d.pop_back();
	d.pop_back();
	 
	deque<int>::iterator it;
	for(it=d.begin();it<d.end();it++)cout<<*it<<" ";
	return 0;
} 

输出:1 2 3 4 5 6 7    

(3)使用erase()方法从中间删除元素,其参数是迭代器位置。

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	for(int i=1;i<10;i++)
	 d.push_back(i);
	
	d.erase(d.begin()+2);
	d.erase(d.begin()+5);
	 
	deque<int>::iterator it;
	for(it=d.begin();it<d.end();it++)cout<<*it<<" ";
	return 0;
} 

输出:1 2 4 5 6 8 9

(4)使用clear()方法清空deque对象

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	for(int i=1;i<10;i++)
	 d.push_back(i);
	d.clear();
	cout<<d.size()<<endl;
	return 0;
} 


### 双端队列 Deque 数据结构 #### 定义 双端队列 (Deque, Double-ended Queue) 是一种可以从两端进行插入和删除操作的线性数据结构[^1]。这种特性使得它可以灵活地处理多种类型的队列需求。 #### 基本操作 双端队列支持如下基本操作: - `push_front(x)`:在前端插入元素 x。 - `pop_front()`:移除并返回前端元素。 - `push_back(x)`:在后端插入元素 x。 - `pop_back()`:移除并返回后端元素。 - `empty()`:判断双端队列是否为空。 - `size()`:获取当前存储元素的数量。 这些操作的时间复杂度通常为 O(1),这得益于内部采用的高效实现机制。 #### 实现方式 双端队列可以通过两种主要的方式实现——基于数组或者链表。每种方法都有各自的优劣之处: - **数组实现**:通过动态分配连续内存来模拟双端队列的行为,适合于已知大小范围的情况;但在频繁增删时可能会引发大量的内存复制开销。 - **链表实现**:利用节点之间的指针链接形成双向循环列表,允许任意位置快速插入/删除而不必担心内存重定位问题,更适合未知规模的数据集。 对于 C++ 中的标准库容器 `std::deque` 而言,则采用了分段管理的技术方案,在保持随机访问特性的前提下优化了性能表现[^2]。 然而值得注意的是,由于 `std::deque` 的特殊设计,当涉及到大量遍历操作时,其效率相对较低,因为每次迭代都需要额外检查是否跨越了某个小块区域的边界[^3]。 #### 应用场景 尽管存在上述局限性,双端队列仍然有着广泛的应用领域: - 作为标准模板库(STL)中栈(stack)和队列(queue)的基础实现之一; - 处理需要同时维护最新与最旧记录的任务调度算法; - 缓存淘汰策略中的 LRU(Least Recently Used)缓存管理; - 图形界面应用程序的消息传递系统等[^4]。 ```cpp // 创建一个简单的 C++ std::deque 并执行一些基础操作 #include <iostream> #include <deque> int main() { std::deque<int> d; // 插入几个整数到 deque 尾部 for(int i=0; i<5; ++i){ d.push_back(i); } // 输出所有元素 while(!d.empty()){ std::cout << d.front() << ' '; d.pop_front(); } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值