C++常用STL容器--deque

7 篇文章 0 订阅
本文深入解析C++标准库中的deque容器,介绍了deque的基本构造、赋值、大小操作、插入删除以及数据存取。deque作为双端数组,其头部插入删除效率高于vector,且内部通过多个缓冲区实现连续内存效果。此外,文章还探讨了deque的排序方法,展示了如何利用sort函数对deque元素进行排序。
摘要由CSDN通过智能技术生成

功能:

  • 双端数组,可以对头端进行插入删除操作

deque与vector区别:

  • vector对于头部的插入删除效率低,数据量越大,效率越低
  • 相对而言,deque对头部的插入删除速度要快
  • vector访问元素时的速度会比deque快,这和两者内部实现有关

在这里插入图片描述

deque内部工作原理:
deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据
中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间

deque构造函数

函数原型

  • deque<T>deqT; //默认构造形式
  • deque(beg,end); //将另一个deque容器【beg,end)区间中的元素拷贝给本身
  • deque(n,elem); //将n个elem元素拷贝给本身
  • deque(deq); //拷贝另一个容器deq

示例

//无参构造函数
deque<int>d1;

//将容器d1元素拷贝给d2
deque<int>d2(d1.begin(),d1.end());

//将10个100拷贝给本身
deque<int>d3(10,100);

//拷贝容器d3给容器d4
deque<int>d4(d3);

deque容器和vector容器的构造方式几乎一致,灵活使用即可


deque赋值

功能

给deque容器进行赋值

函数原型

  • =
  • .assign(beg,end); //将另一个deque容器【beg,end)区间中的元素拷贝给本身
  • .assgin(n,elem); //将n个elem元素拷贝给本身

赋值操作和vector类似,这里不再赘述


deque容器大小

功能

  • 对deque容器的大小进行操作

函数原型

  • .empty(); //判断容器是否为空
  • .size(); //返回容器中元素的个数
  • .resize(n); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置;若容器变短,则末尾超出容器长度的元素被删除
  • .resize(n,elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置;若容器变短,则末尾超出容器长度的元素被删除

deque没有容量(capacity)的概念,当deque容器需要更大的空间时,deque会自动扩展

大小操作和vector类似,这里不再赘述


deque插入、删除

功能

  • 向deque容器中插入和删除数据

函数原型

两端插入操作:

  • .push_front(elem); //在容器头部添加一个数据
  • .push_back(elem); //在容器尾部添加一个数据
  • .pop_front(); //删除容器第一个数据
  • .pop_back(); //删除容器最后一个数据

指定位置插入操作:

  • .insert(pos,elem); //在pos位置插入一个elem元素,返回新数据的位置
  • .insert(pos,n,elem) //在pos位置插入n个elem元素,无返回值
  • .insert(pos,beg,end); //在pos位置插入另一个容器【beg,end)区间的数据,无返回值

删除操作:

  • .clear(); //清空容器中的所有数据
  • .erase(beg,end); //删除【beg,end)区间的数据,返回下一个数据的位置
  • .erase(pos); //删除pos位置的数据,返回下一个数据的位置

示例

	deque<int>d1;
	d1.push_back(5);		//d1初始值为5
	//两端操作
	d1.push_front(1);	//头插,结果为1 5
	d1.push_back(9);	//尾插,结果为1 5 9
	d1.pop_front();	//头删,结果为5 9
	d1.pop_back();	//尾删,结果为5

	//指定位置插入
	d1.insert(d1.begin(), 10);	//结果为10 5
	d1.insert(d1.end(), 2,20);//结果为10 5 20 20
	deque<int>d2;
	d2.push_back(6);	//d2初始值为6
	d2.insert(d2.begin(), d1.begin(), d1.end());//向d2容器中插入d1容器的元素,结果为10 5 20 20 6

	//指定位置删除
	deque<int>::iterator pos = d2.erase(d2.begin());//pos是迭代器,*pos结果为5,&pos结果为地址

	//按区间方式删除
	d1.clear();	//d1清空
	d2.erase(d2.begin(), d2.end());	//d2清空

结果如下:
在这里插入图片描述


deque数据存取

功能:

  • 对deque容器中的数据进行存取操作

函数原型:

  • .at(pos) //返回索引pos所指的数据
  • [pos] //返回索引pos所指的数据
  • .front() //返回容器中第一个数据元素
  • .back() //返回容器中最后一个数据元素

存取操作和vector类似,这里不再赘述


deque排序

功能:

  • 利用sort算法实现对容器进行排序

函数原型:

  • sort(beg,end); //对容器中【beg,end)区间内元素进行排序,默认升序排序

使用sort需要引入头文件<alogrithm>

另外,对于支持随机访问的迭代器的容器,都可以利用sort算法直接对其进行排序,如vector;list不支持随机访问,内部会提供对应排序算法:.sort()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值