C++基础STL-deque容器

2023-11-15

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

deque 容器和 vecotr 容器有很多相似之处,比如:

  • deque 容器也擅长在序列尾部添加或删除元素(时间复杂度为O(1)),而不擅长在序列中间添加或删除元素。
  • deque 容器也可以根据需要修改自身的容量和大小。

        和 vector 不同的是,deque 还擅长在序列头部添加或删除元素,所耗费的时间复杂度也为常数阶O(1)。并且更重要的一点是,deque 容器中存储元素并不能保证所有元素都存储到连续的内存空间中。

当需要向序列两端频繁的添加或删除元素时,应首选 deque 容器。

目录

deque容器构造

给deque容器进行赋值

deque容器大小操作

deque 插入和删除

deque 数据存取

deque 排序

deque容器构造

deque<T> deqT;             //默认构造形式
deque(beg, end);           //构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem);            //构造函数将n个elem拷贝给本身。
deque(const deque &deq);   //拷贝构造函数

示例:

#include<iostream>
using namespace std;
#include <deque>

void printDeque(const deque<int>& d)
{
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
		cout << *it << " ";

	}
	cout << endl;
}
//deque构造
void test01() {

	deque<int> d1; //无参构造函数
	for (int i = 0; i < 5; i++)
	{
		d1.push_back(i);
	}
	printDeque(d1);
	deque<int> d2(d1.begin(), d1.end());
	printDeque(d2);

	deque<int>d3(10, 1);
	printDeque(d3);

	deque<int>d4 = d3;
	printDeque(d4);
}

int main() {

	test01();

	system("pause");

	return 0;
}

运行结果:

给deque容器进行赋值

deque& operator=(const deque &deq);          //重载等号操作符
assign(beg, end);                            //将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);                             //将n个elem拷贝赋值给本身。

示例主要代码演示:

void test01()
{
	deque<int> d1;
	for (int i = 0; i < 5; i++)
	{
		d1.push_back(i);
	}
	printDeque(d1);

	deque<int>d2;
	d2 = d1;
	printDeque(d2);

	deque<int>d3;
	d3.assign(d1.begin(), d1.end());
	printDeque(d3);

	deque<int>d4;
	d4.assign(10, 10);
	printDeque(d4);

}

运行结果:

deque容器大小操作

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

deque.resize(num, elem);          //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。

  ​                                //如果容器变短,则末尾超出容器长度的元素被删除。

示例主要代码演示:

void test01()
{
	deque<int> d1;
	for (int i = 0; i < 10; i++)
	{
		d1.push_back(i);
	}
	printDeque(d1);

	//判断容器是否为空
	if (d1.empty()) {
		cout << "d1为空!" << endl;
	}
	else {
		cout << "d1不为空!" << endl;
		//统计大小
		cout << "d1的大小为:" << d1.size() << endl;
	}

	//重新指定大小
	d1.resize(15, 1);
	printDeque(d1);

	d1.resize(5);
	printDeque(d1);
}

运行结果:

deque 插入和删除

两端插入操作:

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

指定位置操作:

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位置的数据,返回下一个数据的位置。

示例主要代码演示:

//两端操作
void test01()
{
	deque<int> d;
	//尾插
	d.push_back(10);
	d.push_back(20);
	//头插
	d.push_front(100);
	d.push_front(200);

	printDeque(d);

	//尾删
	d.pop_back();
	//头删
	d.pop_front();
	printDeque(d);
}

//插入
void test02()
{
	deque<int> d;
	d.push_back(10);
	d.push_back(20);
	d.push_front(100);
	d.push_front(200);
	printDeque(d);

	d.insert(d.begin(), 1000);
	printDeque(d);

	d.insert(d.begin(), 2, 10000);
	printDeque(d);

	deque<int>d2;
	d2.push_back(1);
	d2.push_back(2);
	d2.push_back(3);

	d.insert(d.begin(), d2.begin(), d2.end());
	printDeque(d);

}

//删除
void test03()
{
	deque<int> d;
	d.push_back(10);
	d.push_back(20);
	d.push_front(100);
	d.push_front(200);
	printDeque(d);

	d.erase(d.begin());
	printDeque(d);

	d.erase(d.begin(), d.end());
	d.clear();
	printDeque(d);
}

运行结果:

deque 数据存取

at(int idx);      //返回索引idx所指的数据
operator[];       //返回索引idx所指的数据
front();          //返回容器中第一个数据元素
back();           //返回容器中最后一个数据元素

示例主要代码演示:

//数据存取
void test01()
{

	deque<int> d;
	d.push_back(1);
	d.push_back(2);
	d.push_front(3);
	d.push_front(4);

	for (int i = 0; i < d.size(); i++) {
		cout << d[i] << " ";
	}
	cout << endl;


	for (int i = 0; i < d.size(); i++) {
		cout << d.at(i) << " ";
	}
	cout << endl;

	cout << "front:" << d.front() << endl;

	cout << "back:" << d.back() << endl;

}

运行结果:

deque 排序

sort(iterator beg, iterator end)  //对beg和end区间内元素进行排序

需要先导入头文件#include <algorithm>

示例:

#include<iostream>
using namespace std;
#include <deque>
#include <algorithm>

void printDeque(const deque<int>& d)
{
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
		cout << *it << " ";

	}
	cout << endl;
}
void test01()
{

	deque<int> d;
	d.push_back(10);
	d.push_back(20);
	d.push_front(100);
	d.push_front(200);

	printDeque(d);
	sort(d.begin(), d.end());
	printDeque(d);

}



int main() {

	test01();
	system("pause");

	return 0;
}

示例:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++基础STL-deque容器 的相关文章

随机推荐

  • Java设计模式-单例模式

    模式定义 确保一个类最多只有一个实例 并提供一个全局访问点 单例模式分为饿汉式和懒汉式 懒汉式单例模式 在类加载时不初始化 饿汉式单例模式 在类加载时就完成了初始化 所以类加载比较慢 但获取对象的速度快 饿汉式 线程安全 饿汉式单例模式 线
  • 2022必备react面试题 附答案

    2022必备react面试题 1 React的严格模式如何使用 有什么用处 StrictMode 是一个用来突出显示应用程序中潜在问题的工具 与 Fragment 一样 StrictMode 不会渲染任何可见的 UI 它为其后代元素触发额外
  • 初学者对java数组中栈和堆的认识

    java数组中栈和堆的认识 1 示例 2 结论 3 图例子 1 示例 public static void main String args String Array null Array new String 3 Array 0 安徽合肥
  • NRF52832学习笔记(2)—— 添加DFU功能(基于SDK15.3)

    前言 SDK版本15 3 评估板 pca10040 在 uart 的例程中添加 DFU 功能 使用 s132 的协议栈 因为官方的 BootLoader 工程用的是s132的协议栈 一 准备工作 在开始实验之前必须先准备以下软件 gcc a
  • linux总结-常用命令(2)

    ls命令 ls命令为list的缩写 通过ls命令可以查看Linux文件夹中包含的文件及其文件权限 包括目录 文件夹 文件权限 目录信息等等 ls 选项 目录 文件 选项 a 列出目录所有文件 包含以 开始的隐藏文件 A 列出除 及 的其它文
  • MDF,LDF格式文件还原数据库

    点你的数据服务名 gt 右键 gt 附加数据库 gt 选择你要还原的数据库文件
  • mxnet——模型加载与保存

    一 加载模型与pretrain模型network相同 loading predict module data shape G 96 Batch namedtuple Batch data sym arg params aux params
  • 比特数据结构课-前言、时间复杂度

    前言 1 什么是数据结构 数据结构 Data Structure 是计算机存储 组织数据的方式 指相互之间存在一种或多种特定关系的数据元素的集合 2 什么是算法 算法 Algorithm 就是定义良好的计算过程 他取一个或一组的值为输入 并
  • 虚拟机出现错误:“无法连接MKS:套接字连接尝试次数太多,正在放弃“,无法进入系统的解决方法

    开发环境 我在windows上使用的是VMware Workstation 14 Pro Ubuntu16 04的组合进行开发 原因 自从将vm从12pro升级成了14pro之后就出现了这种问题 应该是14pro版本本身还有些问题吧 解决方
  • JVM--基础--22--字节码指令

    JVM 基础 22 字节码指令 1 字节码简介 Java字节码由操作码和操作数组成 操作码 1个字节长度 代表某种特定操作含义的数字 操作数 零至多个代表此操作码所需参数 2 字节码与数据类型 在字节码指令集中 大多数指令都有操作所对应的数
  • 力扣412 Fizz Buzz(java+python)

    给你一个整数 n 找出从 1 到 n 各个整数的 Fizz Buzz 表示 并用字符串数组 answer 下标从 1 开始 返回结果 其中 answer i FizzBuzz 如果 i 同时是 3 和 5 的倍数 answer i Fizz
  • Python3,20行代码,通过微信电脑版爬取朋友圈数据,老板再也抓不到我上班看手机了!!!

    爬取微信电脑版朋友圈数据 1 引言 2 桌面图形界面工具介绍 2 1 PyAutoGUI 2 2 PyWinAuto 3 代码实战 1 引言 小屌丝 鱼哥 忙吗 小鱼 忙 小屌丝 想问你件事 小鱼 在忙 没时间 小屌丝 关于妹子的事 小鱼
  • 【Detectron2】入门06:各种模型测试

    FPN voc 训练配置 FPN coco 训练配置 C4 voc 训练配置 Faster RCNN FPN 50 clearn data voc Faster RCNN FPN 50 corrupted data voc Mask RCN
  • github上star较多的三个c++ 内存池memory pool分析

    前言 笔者在写libuv的时候遇到太多uv type t和buffer需要维护了 如果不通过内存池维护 一个是new delete效率非常低 另一个是这种callback和作用域所有权互相耦合的场景 即便是很好的维护了new delete
  • Python处理气象信息grib,grib2文件

    写这篇博客源于博友的提问 1 效果图如下 2 安装 pip install pygrib pip install gributils GRIB 是世界气象组织 World Meterological Organization WMO 用于分
  • windows启动时出现:THE SYSTEM FOUND UNAUTHORIZED CHANGES ON THE FIRMWARE,OPERATIONG SYSTEM OR UEFI DRIVERS

    在启动windows系统容易遇到THE SYSTEM FOUND UNAUTHORIZED CHANGES ON THE FIRMWARE OPERATIONG SYSTEM OR UEFI DRIVERS 尤其是安装完系统以后 尤其针对华
  • MySQL--实战总结

    1 将存在更新部分字段信息 不存在则执行插入合并为一个SQL 需要创建唯一索引 CREATE TABLE user id int 11 NOT NULL AUTO INCREMENT name varchar 255 DEFAULT NUL
  • #CSDN精选博文##学习必备##IT技术学习#系统化学习的第一步:建构自己的知识体系

    大家好 我是小C 全名是CSDN高校俱乐部 我的职责之一是担任 文章过滤器 精选大咖干货 助力学习之路 你是否曾面对海量信息而无从下手 你是否曾苦恼学习效果不佳 事倍功半 你是否曾感叹知识零碎而无法发挥用途 针对这些问题 小C将开启一个全新
  • 数值计算之 最小二乘法(3)最小二乘的矩阵解法

    数值计算之 最小二乘法 3 最小二乘的矩阵解法 前言 回顾最小二乘的线性解 列满秩矩阵的最小二乘解法 Cholesky分解求线性最小二乘解 QR分解求线性最小二乘解 亏秩矩阵的最小二乘解法 SVD分解求亏秩最小二乘解 补充1 超定齐次方程组
  • C++基础STL-deque容器

    双端数组 可以对头端进行插入删除操作 deque 容器和 vecotr 容器有很多相似之处 比如 deque 容器也擅长在序列尾部添加或删除元素 时间复杂度为O 1 而不擅长在序列中间添加或删除元素 deque 容器也可以根据需要修改自身的