c++值deque容器

news2024/11/27 22:40:57

1.deque容器介绍

  deque 是 double-ended queue 的缩写,又称双端队列容器。deque容器支持从头部和尾部双端插入、删除数据。与vector容器不同的是,vector容器是一段连续的空间,而deque没有所谓容量的概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并连接起来。不会像vector那样,因为空间不足而扩容,复制元素到新的空间,再释放旧的空间。因此deque没有必要提供所谓的扩容(reserve)的功能。
在这里插入图片描述
  deque容器可以看做是一个双端数组,可以从头或者尾之间插入数据。从头插入或者删除使用push_front和pop_front。从尾插入或删除输出使用push_backh和pop_back。从任意位置插入可以使用insert函数。
  deque容器,在空间管理上是通过内部中控器来实现的。中控器记录每一个缓冲区的地址。缓冲区中存放真实的数据内容。因而在deque容器中,数据空间是由多段空间组成的。
  deque容器是没有预留空间函数reserve和获取容量大小函数capacity。
  deque从头端插入数据比vector容器快,而且数据量越大越明显。
在这里插入图片描述

2.deque容器构造函数

  deque容器的构造函数和vector类似,由无参构造、有参构造、拷贝构造。

deque构造函数:
	deque() --无参构造
	deque(begin,end);//有参构造,将begin~end之间的数据拷贝
	deque(int count,elem);//count个elem数据
	deque(deque &p);//拷贝构造
  • 应用示例
#include <iostream>
using namespace std;
#include <deque>
#include <algorithm>
void PrintDeque(const deque<int>& p)
{
	for (deque<int>::const_iterator deq = p.begin(); deq != p.end(); deq++)
	{
		cout << *deq << " ";
	}
	cout << endl;
}
void Print(int val)
{
	cout << val << " ";
}
void test()
{
	//创建一个deque容器
	deque<int> deq;
	//插入数据:尾插
	deq.push_back(1);
	deq.push_back(2);
	deq.push_back(3);
	//插入数据:头插
	deq.push_front(4);
	deq.push_front(5);
	deq.push_front(6);
	cout << "第一个数据:" << deq.front() << endl;
	cout << "最后一个数据:" << deq.back() << endl;
	cout << "遍历:" << endl;
	PrintDeque(deq);
	cout << "for_each逆向遍历:" << endl;
	for_each(deq.rbegin(), deq.rend(), Print);
	cout << endl;
	cout << "有参构造:" << endl;
	deque<int> deq2(deq.rbegin(), deq.rend());//区间赋值
	PrintDeque(deq2);
	deque<int> deq3(3, 666);//赋值3个666
	PrintDeque(deq3);
	cout << "拷贝构造:"<< endl;
	deque<int> deq4(deq);//拷贝构造
	PrintDeque(deq4);
}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

3.deque容器赋值

  赋值方式可以直接使用“=”赋值,也可以通过函数assign实现。

deq赋值:
	重载"=":operator=();
	assign(begin,end);//区间赋值
	assign(int count,elem);//count个elem
  • 应用示例
#include <iostream>
using namespace std;
#include <deque>
#include <algorithm>
void PrintDeque(const deque<int>& p)
{
	for (deque<int>::const_iterator deq = p.begin(); deq != p.end(); deq++)
	{
		cout << *deq << " ";
	}
	cout << endl;
}
void test()
{
	deque<int> deq;
	//尾插
	deq.push_back(1);
	deq.push_back(2);
	deq.push_back(3);
	//头插
	deq.push_front(4);
	deq.push_front(5);
	deq.push_front(6);
	cout << "deq 直接插入" << endl;
	PrintDeque(deq);
	deque<int> deq2 = deq;//直接赋值
	cout << "deq2 =赋值" << endl;
	PrintDeque(deq2);
	cout << "deq3 区间赋值" << endl;
	deque<int> deq3;
	deq3.assign(deq.begin(), deq.end());
	PrintDeque(deq3);

}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

4.deque设置和获取元素个数

  判断容器是否为空可以使用empty()函数,设置元素个数可以使用resize()函数,获取元素个数使用size()函数。


deque容器获取大小:
	判断容器是否为空:empty()  ---为空返回true
	获取容器元素个数:size()  
	指定容器大小:resize(int num);
				 resize(int num,elem);//指定大小,超出部分用elem填充
	resize指定大小,若小于则会将超出部分删除
注意:
	deque容器没有获取容量函数capacity()	
  • 应用示例
#include <iostream>
using namespace std;
#include <deque>
#include <algorithm>
void PrintDeque(deque<string>& p)
{
	for (deque<string>::iterator deq = p.begin(); deq != p.end(); deq++)
	{
		cout << *deq << " ";
	}
	cout << endl;
}
void test()
{
	deque<string> deq;
	deq.push_back("hello");
	deq.push_back("学习");
	deq.push_back("c++");
	deq.push_back("deque容器");
	deq.push_back("使用");
	deq.push_back("示例");
	PrintDeque(deq);
	cout << "元素个数:" << deq.size() << endl;
	deq.resize(10,"c++");//指定个数,剩余填充"c++";
	PrintDeque(deq);
	deq.resize(3);
	PrintDeque(deq);
	cout << "元素个数:" << deq.size() << endl;
}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

5.deque元素的插入与删除

  deque容器是双端性质的,所以可以从头端或者尾端插入数据。相关函数如下:

deque容器插入与删除:
	push_back、pop_back  --尾插和尾删
	push_front、pop_front --头插和头删除
	
	insert(pos,elem); --pos是一个迭代器,在pos位置插入elem,返回新数据位置
	insert(pos,n,elem);  ---在pos位置插入n个elem,无返回值
	insert(pos,begin,end); --在pos位置插入begin~endl的数据,无返回值
	
	clear()  --清空整个deque容器
	erase(begin,end); --删除begin~end之间的数,返回下一个数据位置
	erase(pos)  --删除指定位置的数
  • 应用示例
#include <iostream>
using namespace std;
#include <deque>
#include <algorithm>
void PrintDeque(deque<int>& deq)
{
	for (deque<int>::iterator p = deq.begin(); p != deq.end(); p++)
	{
		cout << *p << " ";
	}
	cout << endl;
}
void test()
{
	deque<int> deq;
	//头插
	deq.push_front(1);
	deq.push_front(2);
	deq.push_front(3);
	//尾插
	deq.push_back(4);
	deq.push_back(5);
	deq.push_back(6);
	cout << "\t插入数据示例:" << endl;;
	PrintDeque(deq);
	deq.pop_back();//尾删
	deq.pop_front();//头删
	cout << "\t删除数据示例:" << endl;;
	PrintDeque(deq);
	cout << "\tinsert插入数据示例:" << endl;
	deq.insert(deq.begin() + 2, 666);//在起始的第二个位置插入666
	deq.insert(deq.begin() + 5, 3, 888);//在起始的第5个位置插入三个888
	PrintDeque(deq);
	deque<int> deq2;
	cout << "\tinsert区间插入数据示例:" << endl;
	deq2.insert(deq2.begin(), deq.begin() + 5, deq.begin() + 8);//在deq2的起始位置插入deq的第5~8个位置的数
	PrintDeque(deq2);
	//删除数据
	cout << "指定位置删除:" << endl;
	deq.erase(deq.begin() + 2);//删除第2个位置的数
	PrintDeque(deq);
	cout << "指定区间删除:" << endl;
	deq.erase(deq.begin() + 3, deq.begin() + 6);//删除第3~6位置上的数
	PrintDeque(deq);
	cout << "清空:" << endl;
	deq2.clear();
	PrintDeque(deq2);
}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

6.deque容器数据存取

  deque可以通过 [ ] 读写数据,也可以通过函数 at() 来实现。

deque容器数据存取:
	重载[]operator[]()
	at(pos);
	获取第一个成员:front
	获取最后一个成员:back
	第一个成员的前一个位置:rend
	最后一个成员的下一个位置:end

  • 使用示例:
#include <iostream>
using namespace std;
#include <deque>
#include <algorithm>
void test()
{
	deque<string> deq;
	deq.push_back("hello");
	deq.push_back("c++");
	deq.push_back("学习");
	deq.push_back("示例");

	cout << "最后一个成员:" << deq.back() << endl;
	cout << "第一成员:" << deq.front() << endl;
	cout<<"遍历:"<<endl;
	for (int i = 0; i < deq.size(); i++)
	{
		cout << deq[i] <<" ";
	}
	cout << endl;
}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

7.排序

  可以使用sort函数对成员进行排序。该函数的头文件是algorithm。

排序:sort(iterator begin,iterator end);//默认是升序 
  • 使用示例:
#include <iostream>
#include <string>
#include <algorithm>
#include <deque>
using namespace std;
void test()
{
	string str = "hello,world";
	sort(str.begin(), str.end());
	cout << str << endl;
	deque<int> deq;
	deq.push_back(0);
	deq.push_back(2);
	deq.push_back(1);
	deq.push_front(4);
	deq.push_front(5);
	deq.push_front(6);
	cout << "原内容:" << endl;
	for (int i = 0; i < deq.size(); i++)
	{
		cout << deq[i] << " ";
	}
	cout << endl;
	cout << "排序后:" << endl;
	sort(deq.begin(), deq.end());
	for (int i = 0; i < deq.size(); i++)
	{
		cout << deq[i] << " ";
	}
	cout << endl;
	cout << "数组排序:" << endl;
	int buff[] = { 1,2,3,6,4,0,8,7,2 };
	sort(buff, buff+ sizeof(buff) / sizeof(int));
	for (int i = 0; i < sizeof(buff) / sizeof(int); i++)
	{
		cout << buff[i] << " ";
	}
}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

8.deque使用示例

  有五位选手ABCDE参数演讲比赛,10位评委为其评分。去除一个最高分和最低分,其余求平均值作为选手最后成绩,输出选手比赛结束的成绩信息。

  • 实现方法
      1.创建一个选手类,用于保存每个选手的成绩和姓名;
      2.创建vertor容器,保存五位选手的信息;
      3.创建一个deque容器,保存10位评委打分成绩,对成绩排序,再去除一个最大值,一个最小值,最后求平均值后作为该选手的最终成绩;
      4.输出选手的比赛成绩(按升序排序)。
#include <iostream>
#include <vector>
#include <deque>
#include <algorithm>
using namespace std;
//创建一个类,保存选手名字和成绩
class Person
{
	friend ostream& operator<<(ostream& cout, Person p);//重载<<
public:
	Person(string name, float score) :name(name), score(score)//构造函数
	{

	}
	//重载比较运算符
	bool operator<(Person p)
	{
		return this->score<p.score;
	}
	float score;//成绩
private:
	string name;//姓名
};
//重载<<函数原型
ostream& operator<<(ostream& cout, Person p)
{
	cout << "姓名:" << p.name << "\t成绩:" << p.score;
	return cout;
}


/*
创建选手信息
*/
void Create_Person()
{
	//创建一个vec容器
	vector<Person> vec;//保存选手信息
	string user_name = "ABCDE";
	string name="选手";
	for (int i = 0; i < 5; i++)
	{	
		name = "选手";
		name += user_name[i];
		vec.push_back(Person(name, 0));
	}
	//遍历vector容器
	for (vector<Person>::iterator ptr = vec.begin(); ptr != vec.end(); ptr++)
	{
		//cout << *ptr << endl;
		deque<float> d;//创建deque容器,用于保存评委成绩
		float score;
		for (int i = 0; i < 10; i++)
		{
			score = rand() % 31 + 70;//随机生成成绩,取70~100
			d.push_back(score);//从末尾插入成绩
		}
		sort(d.begin(), d.end());//排序
		d.pop_front();//取出一个最低分
		d.pop_back();//去除一个最高分
		float sum = 0;
		for (deque<float>::iterator p = d.begin(); p != d.end(); p++)
		{
			sum += *p;//求和
		}
		(*ptr).score = sum / d.size();//为每个选择打分
	}
	//输出每个选手成绩信息
	sort(vec.begin(),vec.end());//对vector容器中成员按成绩升序排序
	for (vector<Person>::iterator ptr = vec.begin(); ptr != vec.end(); ptr++)
	{
		cout << *ptr << endl;
	}
}
int main()
{
	srand(time(NULL));
	Create_Person();
}

在这里插入图片描述

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

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

相关文章

Spring Boot 常见面试题

目录 1.Spring Boot 快速入门什么是 Spring Boot&#xff1f;有什么优点&#xff1f;Spring Boot 与 Spring MVC 有什么区别&#xff1f;Spring 与 Spring Boot 有什么关系&#xff1f;✨什么是 Spring Boot Starters?Spring Boot 支持哪些内嵌 Servlet 容器&#xff1f;如何设…

掌握RESTful API:规范与设计详解

前言 RAML (RESTful API Modeling Language) 和 OAS (OpenAPI Specification) 都是用于描述和定义 RESTful API 的规范。它们分别提供了不同的功能和优势。 RAML&#xff08;RESTful API Modeling Language&#xff09;&#xff1a; RAML简介 RAML&#xff08;RESTful API M…

CSC公派研究生项目|北语北外2024年寒假英语培训班正在招生

北京语言大学出国部、北京外国语大学出国部近期发布了2024年寒假“国家建设高水平大学公派研究生项目”英语培训的通知&#xff0c;知识人网小编特归纳整理&#xff0c;供有需求的同学参考。 北京语言大学 我部将于2024年寒假举办“国家建设高水平大学公派研究生项目”英语培训…

银行账单转换beancount

用了beancount来记账后&#xff0c;发现每月的账单手动记是一件极其麻烦的事情。 然后再github搜索一通后&#xff0c;有double-entry-generator&#xff08;https://github.com/deb-sig/double-entry-generator&#xff09;能转换支付宝/微信的账单&#xff0c;但是没有自己用…

基于STM32F412RET6的智能桶硬件设计

一、智能桶功能需求&#xff1a; 智能桶是一直采用Cortex-M4 嵌入式平台&#xff0c;搭载NB-IotTO通讯模组、智能称重采集、智能门锁监控以及温度监测等装置。主要功能如下&#xff1a; ▲ 具有GPS定位功能&#xff0c;可以通过后台APP实时定位智能桶的位置。 ▲ 具有温度监测功…

大厂面试题-Netty中Reactor模式的理解

Reactor其实是在NIO多路复用的基础上提出的一个高性能IO设计模式。 它的核心思想是把响应IO事件和业务处理进行分离&#xff0c;通过一个或者多个线程来处理IO事件。 然后把就绪的事件分发给业务线程进行异步处理。 Reactor模型有三个重要的组件&#xff1a; Reactor&#…

基于单片机的可穿戴个人健康监测仪-智能手环

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、方案的设计与论证2.1设计任务及要求2.2 模块技术和方法综述2.3 设计可能遇到的困难 二、 系统总体框架3.1 硬件设计 三 软件部分4.1 主程序流程框 四、 结论五、 文章目录 概要 近几年智能化的不断发展&#…

GEE——提取制定多波段影像的属性值(按照制定属性名称和属性值)输出格式为矢量格式

简介: 这里我们很多时候,需要提取制定影像,或者多波段影像制定区域的值,这里有一个问题是我们一般输出的结果仅仅是一个字典类型的对象,而我们不知道如何按照一个矢量输入,这里我们首先要做的就是进行多波段值在制定区域的提取,随后就是分别对其新的字典的键、值的设定…

Leetcode76最小覆盖子串

思路&#xff1a;滑动窗口思想 1. 滑动窗口是什么&#xff1a;用一个滑动窗口为覆盖目标子串的字符串 2.怎么移动窗口&#xff1a;当不满足覆盖时右指针移动扩大范围&#xff0c;当覆盖了就移动左指针缩减范围直到再次不覆盖 3. 怎么判断是否覆盖&#xff1a;这里使用两个哈…

Qt封装的Halcon显示控件,支持ROI绘制

前言 目前机器视觉ROI交互控件在C#上做的比较多&#xff0c;而Qt上做的比较少&#xff0c;根据作者 VSQtHalcon——显示图片&#xff0c;实现鼠标缩放、移动图片的文章&#xff0c;我在显示和移动控件的基础上&#xff0c;增加了ROI设置功能&#xff0c;并封装成了一个独立的Q…

记录一次normal diskgroup添加磁盘组操作

客户的一个磁盘组空间快满&#xff0c;需要添加一下磁盘&#xff0c;磁盘组的冗余模式为normal&#xff0c;本来觉得是一件不难的事情&#xff0c;在添加过程中还是遇到了一些问题。 本来为2个500G的磁盘组成的normal模式磁盘组&#xff0c;目前可用空间只剩下170G左右的空间&…

【多线程】线程池总结带你详细了解线程池

文章目录 线程池标准库中的线程池Executors 创建线程池的几种方式ThreadPoolExecutor创建线程池 模拟实现线程池 线程池 线程池是一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配…

基于单片机的自动感应门设计

博主主页&#xff1a;单片机辅导设计 博主简介&#xff1a;专注单片机技术领域和毕业设计项目。 主要内容&#xff1a;毕业设计、简历模板、学习资料、技术咨询。 文章目录 主要介绍一、自动感应门设计的功能概述二、系统总体方案2.1系统的总体计划2.2元器件的介绍2.2.1单片机的…

全局安装 vue-cli 报错 Error: EPERM: operation not permitted, open

原因&#xff1a;没有权限 解决方法&#xff1a;CMD 点击右键 以管理员身份运行。

IDEA创建Springboot多模块项目

一、创建父模块 File --> New --> Project &#xff0c;选择 “ Spring Initalizr ” &#xff0c;点击 Next Next Next --> Finish 二、创建子模块 右键根目录&#xff0c;New --> Module 选择 “ Spring Initializr ”&#xff0c;点击Next 此处注意T…

ubuntu20.04配置解压版mysql5.7

目录 1.创建mysql 用户组和用户2.下载 MySQL 5.7 解压版3.解压 MySQL 文件4.将 MySQL 移动到适当的目录5.更改mysql目录所属的用户组和用户&#xff0c;以及权限6.进入mysql/bin/目录&#xff0c;安装初始化7.编辑/etc/mysql/my.cnf配置文件8.启动 MySQL 服务&#xff1a;9.建立…

【Linux】基本指令-入门级文件操作(三)

目录 基本指令 14 head指令 15 tail指令 管道 16 find指令 17 grep指令 18 zip&#xff06;unzip指令 19 tar指令 20 su指令 总结 基本指令 14 head指令 功能&#xff1a;在屏幕上显示文件的内容&#xff0c;默认显示前10行&#xff0c;如果加上选项-n&#xff0c;则…

go测试库之apitest

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

万宾科技管网水位监测预警,管网水位的特点有哪些?

以往如果要了解城市地下排水管网的水位变化&#xff0c;需要依靠人工巡检或者排查的方式&#xff0c;这不仅加大了人员的工作量&#xff0c;而且也为市政府带来了更多的工作难题。比如人员监管监测不到位或无法远程监控等情况&#xff0c;都会降低市政府对排水管网的管理能力&a…