【C++顺序容器】deque的成员函数和非成员函数

news2024/11/27 19:49:29

目录

deque

1. deque的成员函数

1.1 构造、析构和赋值运算符重载

1.1.1 构造函数

1.1.2 析构函数

1.1.3 赋值运算符重载

1.2 迭代器

1.3 容量

1.4 元素访问

1.4.1 遍历方法

1.5 修改器

1.6 空间配置器

2. deque的非成员函数


deque

deque(通常发音为 "deck")是双端队列的不规则缩写。双端队列是具有动态大小的序列容器,可以在两端(前端或后端)扩展或收缩。

特定的库可能以不同的方式实现deque,通常是某种形式的动态数组。但无论如何,它们都允许通过随机访问迭代器直接访问单个元素,并根据需要通过扩展和收缩容器自动处理存储。

因此,它们提供了与vector类似的功能,但可以在序列的开头(而不仅仅是结尾)有效地插入和删除元素。但是,与vector不同,deque不能保证将所有元素存储在连续的存储位置:通过偏移指向另一个元素的指针来访问deque中的元素会导致未定义的行为。

vector和deque都提供了非常相似的接口,可以用于类似的目的,但两者的内部工作方式截然不同: vector使用的是单个数组,偶尔需要重新分配以满足增长的需要,而deque的元素可以分散在不同的存储块中,容器内部保留了必要的信息,可以在恒定时间内通过统一的顺序接口(通过迭代器)直接访问其中的任何元素。因此,deque的内部结构要比vector复杂一些,但这使得它们在某些情况下能够更有效地增长,特别是在序列很长的情况下,重新分配的代价会更高。

对于在开头或结尾以外的位置频繁插入或移除元素的操作,deque的性能比list和forward_list差,迭代器和引用也不一致。

使用deque类模板要包含deque头文件;deque定义在命名空间std中。

1. deque的成员函数

1.1 构造、析构和赋值运算符重载

1.1.1 构造函数

重载函数功能

default

构造空的deque类对象
fill用n个val来构造
range用迭代器区间[first,last)中的元素顺序构造

copy

构造一个x的拷贝
move移动构造函数
initializer list用初始化列表来构造
#include <iostream>
#include <deque>
#include <string>
using namespace std;

int main()
{
	deque<int> dq1;//default
	for (size_t i = 0; i < dq1.size(); ++i)
	{
		cout << dq1[i] << " ";
	}
	cout << endl;
	//空

	deque<int> dq2(10, 1);//fill
	for (size_t i = 0; i < dq2.size(); ++i)
	{
		cout << dq2[i] << " ";
	}
	cout << endl;
	//1 1 1 1 1 1 1 1 1 1

	string s("hello world");
	deque<char> dq3(s.begin() + 3, --s.end());//range
	for (size_t i = 0; i < dq3.size(); ++i)
	{
		cout << dq3[i] << " ";
	}
	cout << endl;
	//l o   w o r l

	deque<char> dq4(dq3);//copy
	//等价于deque<char> dq4 = dq3;
	for (size_t i = 0; i < dq4.size(); ++i)
	{
		cout << dq4[i] << " ";
	}
	cout << endl;
	//l o   w o r l

	deque<string> dq5{ "happy","new","year" };//initializer list
	//等价于deque<string> dq5 = { "happy","new","year" };
	for (size_t i = 0; i < dq5.size(); ++i)
	{
		cout << dq5[i] << " ";
	}
	cout << endl;
	//happy new year

	return 0;
}

1.1.2 析构函数

1.1.3 赋值运算符重载

1.2 迭代器

函数功能

begin

&

end

begin返回一个迭代器,指向deque对象的第一个元素

end返回一个迭代器,指向deque对象的最后一个元素的下一个位置

rbegin

&

rend

rbegin返回一个反向迭代器,指向deque对象的最后一个元素

rend返回一个反向迭代器,指向deque对象的第一个元素的上一个位置

cbegin

&

cend

cbegin返回一个const迭代器,指向deque对象的第一个元素

cend返回一个const迭代器,指向deque对象的最后一个元素的下一个位置

crbegin

&

crend

crbegin返回一个const反向迭代器,指向deque对象的最后一个元素

crend返回一个const反向迭代器,指向deque对象的第一个元素的上一个位置

begin&end和rbegin&rend返回的迭代器指向:

​​

const_iterator是一个指向const内容的迭代器。迭代器本身可以修改,但是它不能被用来修改它所指向的内容。

begin&end/rbegin&rend和cbegin&cend/crbegin&crend的不同:

  • begin&end/rbegin&rend的返回类型由对象是否是常量来决定。如果不是常量,返回iterator;如果是常量,返回const_iterator。
  • cbegin&cend/crbegin&crend的返回类型是const_iterator,不管对象本身是否是常量。
#include <deque>
#include <iostream>
using namespace std;

int main()
{
	deque<int> dq;
	dq.push_back(1);
	dq.push_back(2);
	dq.push_back(3);
	dq.push_back(4);

	deque<int>::iterator it = dq.begin();
	while (it != dq.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	//1 2 3 4

	auto rit = dq.rbegin();
	//deque<int>::reverse_iterator rit = dq.rbegin();
	while (rit != dq.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;
	//4 3 2 1

	return 0;
}

1.3 容量

函数功能
size

返回deque的元素个数

max_size返回deque所能容纳的最大元素数
resize

调整deque的大小为n(影响size)

●如果n<当前deque的大小,多余的元素会被截掉

●如果n>当前vdeque的大小,则:

  1)如果没有指定填充元素,则在最后插入尽可能多的元素以达到n的大小

  2)如果指定了填充元素val,则多出的空间用val填充

●如果n也>当前deque的容量,则会自动重新分配存储空间

empty检测deque是否为空,是返回true,否则返回false
shrink_to_fit

收缩容量以适应deque的大小

这个请求没有约束力,容器实现可以自由地进行优化,使deque的容量大于其大小

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

int main()
{
	deque<int> dq;
	dq.push_back(1);
	dq.push_back(2);
	dq.push_back(3);
	dq.push_back(4);

	cout << dq.size() << endl;//4
	cout << dq.max_size() << endl;//1073741823

	dq.resize(8, 9);
	for (size_t i = 0; i < dq.size(); ++i)
	{
		cout << dq[i] << " ";
	}
	cout << endl;
	//1 2 3 4 9 9 9 9

	if (dq.empty())
		cout << "deque为空" << endl;
	else
		cout << "deque不为空" << endl;
	//deque不为空

	return 0;
}

1.4 元素访问

函数功能
operator[]

返回deque中n位置的元素的引用

没有越界检查

at

返回deque中n位置的元素的引用

有越界检查,如果越界会抛异常

front返回deque中第一个元素的引用
back返回deque中最后一个元素的引用
#include <deque>
#include <iostream>
using namespace std;

int main()
{
	deque<int> dq;
	dq.push_back(1);
	dq.push_back(2);
	dq.push_back(3);
	dq.push_back(4);

	cout << dq[0] << endl;//1
	cout << dq.at(1) << endl;//2
	cout << dq.front() << endl;//1
	cout << dq.back() << endl;//4

	return 0;
}

1.4.1 遍历方法

1.4.1.1 operator[](最常用)

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

int main()
{
	deque<int> dq;
	dq.push_back(1);
	dq.push_back(2);
	dq.push_back(3);
	dq.push_back(4);

	for (size_t i = 0; i < dq.size(); ++i)
	{
		cout << dq[i] << " ";
	}
	cout << endl;
	//1 2 3 4

	return 0;
}

1.4.1.2 迭代器

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

int main()
{
	deque<int> dq;
	dq.push_back(1);
	dq.push_back(2);
	dq.push_back(3);
	dq.push_back(4);

	deque<int>::iterator it = dq.begin();
	while (it != dq.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	//1 2 3 4

	auto rit = dq.rbegin();
	//deque<int>::reverse_iterator rit = dq.rbegin();
	while (rit != dq.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;
	//4 3 2 1

	return 0;
}

1.4.1.3 范围for

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

int main()
{
	deque<int> dq;
	dq.push_back(1);
	dq.push_back(2);
	dq.push_back(3);
	dq.push_back(4);

	for (auto e : dq)
	{
		cout << e << " ";

	}
	cout << endl;
	//1 2 3 4

	return 0;
}

1.5 修改器

函数功能
assign给deque赋值,替换其当前内容
push_back尾插
push_front头插
pop_back尾删
pop_front头删
insert在position位置之前插入
erase删除deque的一部分
swap交换内容
clear清空内容
emplace构建和插入元素
emplace_front在开头构建和插入元素
emplace_back在末尾构建和插入元素
#include <deque>
#include <iostream>
using namespace std;

int main()
{
	deque<int> dq1{ 1,2,3,4 };

	dq1.assign(3, 6);
	for (size_t i = 0; i < dq1.size(); ++i)
	{
		cout << dq1[i] << " ";
	}
	cout << endl;
	//6 6 6

	dq1.push_back(1);
	dq1.push_front(2);
	for (size_t i = 0; i < dq1.size(); ++i)
	{
		cout << dq1[i] << " ";
	}
	cout << endl;
	//2 6 6 6 1

	dq1.pop_back();
	dq1.pop_front();
	for (size_t i = 0; i < dq1.size(); ++i)
	{
		cout << dq1[i] << " ";
	}
	cout << endl;
	//6 6 6

	dq1.insert(dq1.begin() + 1, 9);
	for (size_t i = 0; i < dq1.size(); ++i)
	{
		cout << dq1[i] << " ";
	}
	cout << endl;
	//6 9 6 6

	dq1.erase(dq1.begin());
	for (size_t i = 0; i < dq1.size(); ++i)
	{
		cout << dq1[i] << " ";
	}
	cout << endl;
	//9 6 6

	deque<int> dq2{ 8,8,8,8 };

	dq1.swap(dq2);
	for (size_t i = 0; i < dq1.size(); ++i)
	{
		cout << dq1[i] << " ";
	}
	cout << endl;
	//8 8 8 8

	dq1.clear();
	if (dq1.empty())
		cout << "dq1被清空" << endl;
	else
		cout << "dq1没被清空" << endl;
	//dq1被清空

	return 0;
}

1.6 空间配置器

函数功能
get_allocator获取空间配置器

2. deque的非成员函数

函数功能
relational operators关系运算符重载
swap交换内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/742209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

告别VLAN孤岛,两招让你轻松实现互访

实际网络中&#xff0c;经常会有VLAN之间互访的需求。 很多网工通常会选择一些方法&#xff0c;来实现不同VLAN间主机的相互访问&#xff0c;比如说Vlanif、单臂路由。 今天就教你轻松实现VLAN间互访。 01-通过子接口实现 VLAN 间的互访 在二层交换环境下&#xff0c;一个VLA…

线程是什么

目录 一、教材观点 二、简述进程是如何运行的 简述进程切换原理&#xff1a; 三、线程是什么 线程底层是如何被管理的 四、重讲线程概念理解 一、教材观点 教材观点&#xff1a; 线程是一个执行分支&#xff0c;执行分支更细&#xff0c;调度成本更低。线程是进程内部的…

Android SystemServer 启动流程分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、SystemServer 启动的服务有哪些二、SystemServer启动总体流程概述三、SystemServer 如何启动&#xff0c;是谁启动的&#xff1f;四、 SystemServe…

解决哈希冲突

1、HashMap引入了链式寻址法来解决hash冲突&#xff0c;冲突的key&#xff0c;HashMap把这些key组成一个单向链表&#xff0c;然后采用尾插法把key保存到链表的尾部。 使用二次扰动函数&#xff08;hash函数&#xff09;来降低哈希冲突的概率&#xff0c;使数据平均分布。 pu…

【VUE】Unterminated template literal:拼接字符串包括<script></script>时报错误

vue拼接字符串包括时报错误提示Unterminated template literal vue拼接字符串包括script标签时报错误提示Unterminated template literal解决方法加反斜杠就可以&#xff0c;在script结束标签里边加反斜杠<\/script> 代码 htmlData: <div id"b0e5c00cc51e4a4…

svg图标颜色随父元素变换

给svg加上一下样式 fill: currentColor;注&#xff1a;为什么有的svg设置了fill: currentColor;还是一样不生效&#xff1f; 用电脑自带的txt或者代码开发工具&#xff08;如&#xff1a;HbuilderX&#xff09;打开svg文件 全局搜索 fill 把fill指定颜色去掉 保存就OK了

存储函数,存储过程的应用

查看触发器 mysql> show triggers \G *************************** 1. row ***************************Trigger: student_insert_triggerEvent: INSERTTable: studentStatement: BEGINupdate student_total set totaltotal1;ENDTiming: AFTERCreated: 2023-07-11 16:13:51…

msvcp71.dll丢失怎样修复,msvcp71.dll丢失的三个解决方法

在运行游戏&#xff0c;软件程序的时候&#xff0c;电脑提示msvcp71.dll丢失怎样修复&#xff1f;下面小编就开始介绍msvcp71.dll在电脑系统中的的目录&#xff0c;作用&#xff0c;以及丢失后三个解决方法。 目录 msvcp71.dll通常位于系统目录里&#xff1a; msvcp71.dll丢失…

本地git 提交代码时 报错 [session-4d40e187] Access denied

1、首先执行以下命令查看本地是否绑定仓库 git remote -v2、如果没有执行以下命令添加 git remote add name(仓库名) git地址 // 添加成功后执行git remote -v 检查3、提交代码到新仓库&#xff0c;执行以下代码即可 git add . git commit -m fix:init git push name(于第二…

有趣的命令——————用shell脚本实现(石头剪刀布)小游戏

vim games。sh 输入以下内容&#xff1a;#!/bin/bash echo "这是一个小游戏(石头0 剪刀1 布2)&#xff0c;放松一下:" pc$(expr $RANDOM % 3) read -p "请输入你的选择:" user if [ $pc -eq 0 -a $user -eq 2 ] || [ $pc -eq 1 -a $user -eq 0 ] || [ $pc …

单个电源模块带电感的直流压降仿真(三)

单个电源模块带电感的直流压降仿真(三) 接单个电源模块带电感的直流压降仿真(二) 设置负载Sink,按照向导逐步设置

C++好难(9):C++的多态

目录 1.多态的概念 2.多态的定义及实现&#xff1a; &#x1f349;多态的构成条件 &#x1f349;虚函数 &#x1f349;虚函数的重写 &#x1f349;虚函数重写的三个例外 &#x1f352;子类虚函数可以不加vector &#x1f352;析构函数的重写 &#x1f352;协变&#xf…

开源铸剑,五载匠心!Zilliz Cloud云服务盛装登场,引领向量数据库云时代!

2023 年注定是属于大模型和向量数据库的巅峰时刻。国内大模型的发展也迎来前所未有之机遇&#xff0c;“百模”激战正酣。在刚闭幕的世界人工智能大会上&#xff0c;国内外科技公司全线加入&#xff0c;三十余款大模型集中亮相&#xff0c;“国家队”尘埃落定&#xff0c;并正式…

接口测试(二) 优化项目分层及cookies值带入

整个项目分层如图 然后上代码 #data_test.py from openpyxl import load_workbook import json import osclass Date_test():filepath os.path.dirname(os.path.dirname(__file__))def __init__(self):self.case_id Noneself.url Noneself.data Noneself.Method Noneself…

模拟实现C++的string库的改进

之前写过&#xff0c;(8条消息) 模拟实现C的string库_Qianxueban的博客-CSDN博客 比较简单&#xff0c;我就直接截图的。我要改进一下。 1.改进string类中可以在字符串中存储\0 但我写的没有这项功能&#xff0c;究其根本就是代码我用的都是strcpy等等函数&#xff0c;应该用…

5G理论概述

文章目录 SA组网架构及协议栈4-5G核心网侧融合交互5G与4G用户标识5G网络网元和设备类型&#xff0c;接口1、AMF(Access and Mobility Management Function)&#xff0c;接入和移动管理功能2、SMF&#xff08;Session Management function&#xff09;&#xff0c;会话管理功能3…

MQTT快速入门

官网文档 前言&#xff1a; MQTT 是用于物联网连接的 OASIS 标准&#xff0c;它是一种基于发布订阅模式的、轻量级的消息传输协议&#xff0c;专为受限设备和低带宽、高延迟和不可靠的网络设计&#xff0c;并且能够提供一定的消息可靠性保证。得益于这些特性&#xff0c;MQTT…

在vite创建的vue3项目中使用Cesium标记地点(基于加载建筑样式,划分区域)

在vite创建的vue3项目中使用Cesium标记地点&#xff08;基于加载建筑样式&#xff0c;划分区域&#xff09; 使用vite创建vue3项目 npm create vitelatestcd到创建的项目文件夹中 npm install安装Cesium npm i cesium vite-plugin-cesium vite -D配置 vite.config.js文件&#…

通过平均列比较两组迭代次数

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让差值结构中有6个1, 行分布是0&#xff0c;1&#xff0c;1&#xff0c;1&#xff0c;1&#xff0c;2列分布是2&#xff0c;2&#xff0c;2.统计迭代次…

Java-多线程编程——基础篇及相关面试题

这里写目录标题 一、前言二、进程与线程的基本概念三、为什么Java中引入多线程&#xff1f;3.1 并行处理3.2 提高性能3.3 提高响应能力3.4 资源共享3.5 异步编程 四、Java多线程-创建多线程的类和接口4.1 Thread类4.2 Runnable接口 五、示例代码5.1 使用Thread类创建多线程六、…