ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c++ 之deque

2021-02-25 22:30:07  阅读:226  来源: 互联网

标签:deque iterator iqu 元素 Tp c++ 内存


文章目录

1.deque 的简介

①deque 系由一块一块的固定大小的连续空间构成(块与块之间是不连续)。一旦有必要在 deque 的前端或尾端增加新的空间,便配置一块固定大小的连续空间,串接在整个 deque 的头端或尾端。

②deque 的最大任务,便是在这些分块的固定大小连续空间上,维护其整体连续的假象,并提供随机存取的接口(随机迭代器),代价则是迭代器架构较为复杂。

③deque 采用一块所谓的_M_map(注意,不是 STL 的 map 容器)作为主控。这里所谓_M_map 是一小块连续空间,其中每个元素(此处称为一个节点,node)都是指针,指向另一段(较大的)连续线性空间,称为缓冲区。缓冲区才是 deque 的储存空间主体。

示例:

#include<iostream>
#include<deque>
using namespace std;

template < class _Tp>
struct _Deque_iterator          //迭代器
{
	typedef _Tp** _Map_pointer;

	_Tp * _M_cur;
	_Tp * _M_first;
	_Tp * _M_last;
	_Map_pointer _M_node;
};

template < class _Tp>
class _Deque_base                //deque存储结构
{
	typedef _Deque_iterator<_Tp> iterator;
protected:
	_Tp * *_M_map;
	size_t _M_map_size;
	iterator _M_start;
	iterator _M_finish;
};

int main()
{
	std::deque<int> iqu;
	return 0;
}

在这里插入图片描述

2.deque的常用成员函数:

iqu[ ]:用来访问双向队列中单个的元素。
iqu.front():返回第一个元素的引用。
iqu.back():返回最后一个元素的引用。
iqu.push_front(x):把元素x插入到双向队列的头部。
iqu.pop_front():弹出双向队列的第一个元素。
iqu.push_back(x):把元素x插入到双向队列的尾部。
iqu.pop_back():弹出双向队列的最后一个元素。

示例:

int main()
{
	std::deque<int> iqu;
	for (int i = 1; i <= 5; ++i)
	{
		iqu.push_back(i);
	}
	deque<int>::iterator it;
	for (it = iqu.begin();it != iqu.end();it++)
	{
		cout << *it ;
	}
	cout << endl;
	cout << iqu.front() << endl;
	cout << iqu.back() << endl;
	iqu.push_front(0);
	iqu.push_back(6);
	for (it = iqu.begin();it != iqu.end();it++)
	{
		cout << *it ;
	}
	iqu.pop_front();
	iqu.pop_back();
	cout << endl;
	for (it = iqu.begin();it != iqu.end();it++)
	{
		cout << *it;
	}
	return 0;
}

在这里插入图片描述

3.deque图解

for (int i = 1; i <= 5; ++i)
{
	iqu.push_back(i);
}

在这里插入图片描述

iqu.pop_front();

在这里插入图片描述
③会增加新的缓冲区

 for (int i = 6; i <= 16; ++i)
 {
     iqu.push_back(i);
 }

在这里插入图片描述

4.deque 与 vector 的区别

vector特点:动态数组,内存是连续的,2倍的方式进行扩容;

deque特点:动态开辟的二维数组空间,内存并不连续,第二维是独立new出来的,属于分段连续。固定长度,扩容的时候,第一维的数组进行二倍扩容

①deque 两端都能够快速插入和删除元素 O(1),vector 只在尾端进行插入和删除 O(1)。

②deque 的元素存取和迭代器操作会稍微慢一些,因为 deque 的内部结构会多一个间接过程。

③deque 中的迭代器是特殊的智能指针,而不是一般指针,它需要在不同的区块之间跳转。因为 deque 使用不止一块内存(而 vector 必须使用一块连续内存)。

④deque 不支持对容量和内存重分配时机的控制,除了首尾两端安插、删除元素外,其他地方安插、删除元素都将导致元素的 pointer、reference、iterator 失效。不过,deque 的内存重分配机制优于 vector,因为 deque 不必在内存重分配时复制所有的元素deque 的内存区块不再被使用时,会被释放

标签:deque,iterator,iqu,元素,Tp,c++,内存
来源: https://blog.csdn.net/qq_46615150/article/details/114107021

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有