我是靠谱客的博主 风趣保温杯,最近开发中收集的这篇文章主要介绍c++ 之deque1.deque 的简介2.deque的常用成员函数:3.deque图解4.deque 与 vector 的区别,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 1.deque 的简介
    • 示例:
  • 2.deque的常用成员函数:
    • 示例:
  • 3.deque图解
  • 4.deque 与 vector 的区别

1.deque 的简介

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

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

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

④底层数据结构:动态开辟的二位数组,一维数组从2开始,以2倍的方式进行扩容,每次扩容后,原来第二维的数组从新的第一维数组的下标的oldsize/2开始存放,上下都预留相同的空行,方便支持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插入到双向队列的头部。O(1)
iqu.pop_front():弹出双向队列的第一个元素。O(1)
iqu.push_back(x):把元素x插入到双向队列的尾部。O(1)
iqu.pop_back():弹出双向队列的最后一个元素。O(1)
iqu.insert(it,20),O(n)
iqu.erase(it);从it指向的位置删除元素O(n)

示例:

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和list,比vector容器多出来的增加删除函数接口:
push_front和pop_front.

最后

以上就是风趣保温杯为你收集整理的c++ 之deque1.deque 的简介2.deque的常用成员函数:3.deque图解4.deque 与 vector 的区别的全部内容,希望文章能够帮你解决c++ 之deque1.deque 的简介2.deque的常用成员函数:3.deque图解4.deque 与 vector 的区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部