【C++STL】deque的结构和使用

deque的简介(双开口的“连续”空间的数据结构。)

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

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

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

deque的存储结构:

//迭代器

template<class _Tp>
struct _Deque_iterator
{
	typedef _Tp** _Map_pointer;

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

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


默认构造

#include<deque>
int main(void)
{
	std::deque<int> deq1;
	return 0;
}

如下图:
可以看到此时的_M_map为空,大小为0;
开始迭代器和结束迭代器中的各指针也为空,
请添加图片描述

std::deque<int> iqu;
for(int i =1,i<5;i++ )
{
  iqu.push_back(i);
}

插入元素:
请添加图片描述

请添加图片描述

从队头取数据

iqu.pop_front()

iqu.pop_front()

请添加图片描述

插入数据

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

请添加图片描述

如果此时再插入一个元素,会引发新的缓冲区配置。

iqu.push_back(16)
请添加图片描述

头插元素和尾插元素:

iqu.push_back(20);
iqu.push_back(30);
iqu.push_back(40);
iqu.push_back(50);
iqu.push_front(23);
iqu.push_front(34);

请添加图片描述

再次头插:

iqu.push_front(45);
iqu.push_front(56);

请添加图片描述

注意:(串接空间)

  1. 如果插入的时候,_Map_size的下半部分已经满了,而上半部空闲,就会把在申请新的缓冲区,就会将m_node向上移动。
  2. 如果deque中的_Map_size已经满了,在_M map的前端或者尾端增加新的空间,便配置一块固定大小的连续空间,**串接在整个deque的头端或者尾端。**不需要拷贝数据。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值