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

文章目录

  • deque的简介(双开口的“连续”空间的数据结构。)
  • 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
int main(void)
{
	std::deque<int> deq1;
	return 0;
}

如下图:
可以看到此时的_M_map为空,大小为0;
开始迭代器和结束迭代器中的各指针也为空,
【C++STL】deque的结构和使用_第1张图片

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

插入元素:
【C++STL】deque的结构和使用_第2张图片

【C++STL】deque的结构和使用_第3张图片

从队头取数据

iqu.pop_front()

iqu.pop_front()

【C++STL】deque的结构和使用_第4张图片

插入数据

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

【C++STL】deque的结构和使用_第5张图片

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

iqu.push_back(16)
【C++STL】deque的结构和使用_第6张图片

头插元素和尾插元素:

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

【C++STL】deque的结构和使用_第7张图片

再次头插:

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

【C++STL】deque的结构和使用_第8张图片

注意:(串接空间)

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

你可能感兴趣的:(STL,C++深入学习,c++,开发语言)