C++ deque容器

基本概念

deque(double-ended queue)双端队列(双端数组)

功能

  • 可分别在头端、尾端进行插入删除操作
    C++ deque容器_第1张图片

deque和vector的区别

  • 相同之处
      1.支持随机访问,迭代器均属于random-access iterator;
      2.基于中间位置的元素的移除和插入,速度都比较慢,因为要进行大量元素的移动和复制操作;
      3.vector所支持的接口在deque上都能使用,且具有相同的效果。
  • 不同之处
      1.两端都能够进行快速的插入和移除操作;
      2.访问deque时,内部结构会多一个间接过程,因此元素的访问以及迭代器的动作会相比vector较慢;
      3.迭代器需要在不同的区块间进行跳转,因此迭代器必须是smart_pointer,不能是寻常pointer;
      4.Deque不支持对容量大小的控制,需要特别注意的是,除了首尾两端,在任何地点安插或者删除元素都会导致pointer、reference和iterator的失效;
      5.Deque重新分配内存优于vector,因为其内部结构显示,deque重新分配内存的时候,不需要复制所有的元素;
      6.Deque会释放不需要的内存块,Deque的大小是可缩减的,但是要不要这么做,如何做,取决于编译器。
      总结:显然,deque具有vector的特性,且比vector更强大,但C++之中,更强大的功能往往意味这更大的时空开销,如何在功能和开销上作取舍,取决于具体应用场景

deque实现原理

内存结构

deque使用多段连续内存空间(每段内存空空间大小一致)来存储数据元素,插入元素时可根据需要重新增加一段内存空间。
为了维护多段内存空间,使其在使用上如同一段连续的内存空间,deque设计了一个中控器map(数组),中控器记录着每一段内存空间的地址。其结构如下:
C++ deque容器_第2张图片

数据访问

deque除了维护了一个中控器map;其还维护着start和finish两个迭代器,分别指向deque的首尾;此外,还必须记录map的大小,一旦map的空间不够,则配置一个更大的map;还记录了指定的内存段的大下。
C++ deque容器_第3张图片
有了以上这些数据信息,就可以实现对多段内存空间的随机访问了。

插入操作

1、头尾插入

  • 如果备用空间足够,就直接push进去
  • 如果备用空间不足,就要考虑配置一个新的缓冲区
  • 配置新缓冲区的时候, 如果map空间足够,就直接配置一块新的缓冲区,链接到map中
  • 如果map空间不足,就需要考虑重新配置一块map

2、中间插入(理解时就把deque多段内存看成一段连续内存空间)
中间插入时其实基本原理和vector一致,都需要进行元素位置的移动;只不过因为deque是双端的,所以会根据插入元素位置前后的元素个数来决定是移动前面的元素还是移动后面的元素。

  • 判断插入位置前面元素少还是后面元素少
  • 前面元素少,则把插入位置前元素进行拷贝移动
  • 后面元素少,则把插入位置后元素进行拷贝移动
    更多参考

deque构造函数

函数原型

deque();				//默认构造函数
deque(beg, end); 		//创建deque对象,并使用[beg,end)(前开后闭)的元素进行初始化
deque(n, elem);   		//创建deque对象,使用n个elem元素进行初始化
deque(const deque &deq); 	//拷贝构造函数

deque赋值操作

//重载操作符=
deque& operator=(const deque &deq); //重载等号运算符
//assign赋值
void assign(beg, end);		//将区间[beg,end)的值拷贝赋值给deque
void assign(n, elem);		//将n个elem赋值给deque

deque大小

函数原型

//判断是否为空
bool empty();
//size
size();		//返回容器中元素的个数
resize(int num);	// 重新制定容器中元素个数,若容器变长,则以默认值填充
			        // 如果容器变短,则超出容器长的元素被删除、
resize(int num, elem);	// 重新制定容器中元素个数,若容器变长,则以指定值填充
			            // 如果容器变短,则超出容器长的元素被删除

deque插入和删除

函数原型

//头尾操作
void push_back(elem);    
void push_front(elem);
void pop_back();
void pop_front();
//insert
insert(const_iterator pos, elem);		//在位置pos插入元素elem9(pos位置开始元素后移),返回插入数据的迭代器
insert(const_iterator pos, n, elem);	//在位置pos插入n个elem,返回插入第一元素的迭代器
insert(const_iterator pos, beg, end);	//在位置pso插入区间[beg,end)的元素,返回插入第一元素的迭代器
//erase
erase(const_iterator pos);						//删除pos位置的元素,返回下一个元素的位置
erase(const_iterator beg, const_iterator end);  //删除区间[beg,end)的数据,返回下一元素的位置
//clear
clear(); 							//清空容器的所有数据

deque数据存取

函数原型

//重载运算符[]
operator[];  //存取索引idx所指的数据
//at
at(int idx); //c存储索引idx所指的数据
//前后
front();	//返回容器的第一个元素
back();		//返回容器的最后一个元素

deque排序操作

使用sort函数对deque进行排序
用法:

#include 
sort(iterator beg, iterator end); //对[beg,end)区间元素进行排序

适用于所有支持随机访问的容器,vector,deque…

STL常用容器

常用容器

你可能感兴趣的:(C++,c++)