黑马c++ STL部分 笔记(3) deque容器

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

deque与vector区别:
vector对于头部的插入删除效率低,数据量越大,效率越低(每次头插,后面的元素就往后移)
deque相对而言,对头部的插入删除速度回比vector快
vector访问元素时的速度会比deque快,这和两者内部实现有关


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

deque容器的迭代器也是支持随机访问的

1.deque的构造函数

// deque构造函数
/*
功能描述:
deque容器构造
函数原型:
deque<T> deqT; //默认构造形式
deque(beg, end); //构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem); //构造函数将n个elem拷贝给本身。
deque(const deque &deq); //拷贝构造函数
*/
#include <bits/stdc++.h>
using namespace std;
void printdeque(deque<int> &d)
{for (deque<int>::iterator it = d.begin(); it != d.end(); it++){//*it=100;//每个值都改为100,若只读,则deque<int> 改为const deque<int>即可,即容器中只读cout << *it << " ";}cout << endl;
}
void test01()
{deque<int> d1; // 默认构造for (int i = 0; i < 10; i++){d1.push_back(i);}printdeque(d1);                      // 0 1 2 3 4 5 6 7 8 9deque<int> d2(d1.begin(), d1.end()); // 区间构造printdeque(d2);                      // 0 1 2 3 4 5 6 7 8 9deque<int> d3(3, 100);               // n个elementprintdeque(d3);                      // 100 100 100deque<int> d4(d3);                   // 拷贝构造printdeque(d4);                      // 100 100 100
}int main()
{test01();
}
/*
总结:deque容器和vector容器的构造方式几乎一致,灵活使用即可
*/

 2.deque赋值操作

// deque赋值操作
/*
功能描述:
给deque容器进行赋值
函数原型:
deque& operator=(const deque &deq); //重载等号操作符
assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem); //将n个elem拷贝赋值给本身。
*/
#include <bits/stdc++.h>
using namespace std;
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> d1;for (int i = 0; i < 10; i++){d1.push_back(i);}printdeque(d1); // 0 1 2 3 4 5 6 7 8 9deque<int> d2;d2 = d1;        //=赋值printdeque(d2); // 0 1 2 3 4 5 6 7 8 9deque<int> d3;d3.assign(d1.begin(), d1.begin() + 3); // assign  (左闭右开)printdeque(d3);                        // 0 1 2deque<int> d4;d4.assign(3, 100); // assign,n个elementprintdeque(d4);    // 100 100 100
}int main()
{test01();
}
/*
总结:deque赋值操作也与vector相同,需熟练掌握
*/

3.deque大小操作 

// deque大小操作
/*
功能描述:
对deque容器的大小进行操作
函数原型:
deque.empty(); //判断容器是否为空
deque.size(); //返回容器中元素的个数
deque.resize(num); //重新指定容器的长度为num
若容器变长,则以默认值0填充新位置。
若容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem); //重新指定容器的长度为num,
若容器变长,则以elem值填充新位置。
若容器变短,则末尾超出容器长度的元素被删除。
*/
#include <bits/stdc++.h>
using namespace std;
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> d1;for (int i = 0; i < 10; i++){d1.push_back(i);}printdeque(d1); // 0 1 2 3 4 5 6 7 8 9if (d1.empty()){cout << "d1为空" << endl;}else{cout << "d1不为空" << endl;cout << "d1的大小:" << d1.size() << endl; // 10// 无d1.capacity,因为可以无限放数据,与其结构有关}// 重新指定大小d1.resize(15);printdeque(d1); // 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0d1.resize(16, 111);printdeque(d1); // 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 111d1.resize(5);printdeque(d1); // 0 1 2 3 4
}int main()
{test01();
}
/*
总结:
deque没有容量的概念,vector有
判断是否为空 — empty
返回元素个数 — size
重新指定个数 — resize
*/

4.deque 插入和删除

// deque 插入和删除
/*
功能描述:
向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位置的数据,返回下一个数据的位置。
*/
#include <bits/stdc++.h>
using namespace std;
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> d1;// 尾插d1.push_back(1);d1.push_back(2);d1.push_back(3);printdeque(d1); // 1 2 3// 头插d1.push_front(100);d1.push_front(200);d1.push_front(300);printdeque(d1); // 300 200 100 1 2 3// 尾删d1.pop_back();printdeque(d1); // 300 200 100 1 2// 头删d1.pop_front();printdeque(d1); // 200 100 1 2// 两端操作// insertd1.insert(d1.begin() + 1, 1000); // pos为迭代器printdeque(d1);                  // 200 1000 100 1 2d1.insert(d1.begin(), 2, 111);printdeque(d1); // 111 111 200 1000 100 1 2// 在指定位置插入区间deque<int> d2;d2.push_back(1);d2.push_back(2);d2.push_back(3);d1.insert(d1.begin(), d2.begin(), d2.end());printdeque(d1); // 1 2 3 111 200 1000 100 1 2// 删除d1.erase(d1.begin());               // 删除pos位置printdeque(d1);                     // 2 3 111 200 1000 100 1 2d1.erase(d1.begin() + 1, d1.end()); // 删除区间元素printdeque(d1);                     // 2int main(){test01();}/*总结:插入和删除提供的位置是迭代器!尾插 — push_back尾删 — pop_back头插 — push_front头删 — pop_front*/

5.deque 数据存取

// deque 数据存取
/*
功能描述:
对deque 中的数据的存取操作
函数原型:
at(int idx); //返回索引idx所指的数据
operator[]; //返回索引idx所指的数据
front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素
*/
#include <bits/stdc++.h>
using namespace std;
void test01()
{deque<int> d;d.push_back(10);d.push_back(20);d.push_back(30);d.push_front(100);d.push_front(200);d.push_front(300);// 通过[]for (int i = 0; i < d.size(); i++){cout << d[i] << " "; // 300 200 100 10 20 30}cout << endl;// 通过atfor (int i = 0; i < d.size(); i++){cout << d.at(i) << " "; // 300 200 100 10 20 30}cout << endl;cout << d.front() << " " << d.back(); // 300 30
}
int main()
{test01();
}
/*
总结:
除了用迭代器获取deque容器中元素,[ ]和at也可以
front返回容器第一个元素
back返回容器最后一个元素
*/

6.deque 排序

// deque 排序
/*
功能描述:
利用算法实现对deque容器进行排序
函数原型:
sort(iterator beg, iterator end) //对beg和end区间内元素进行排序
*/
#include <bits/stdc++.h>
using namespace std;
void printdeque(const deque<int> &d)
{for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++){cout << *it << " ";}cout << endl;
}
bool cmp(int d1, int d2)
{ // 使sort后按自定义方式排序// 例:降序if (d1 > d2)return true;elsereturn false;
}
void test01()
{deque<int> d;d.push_back(10);d.push_back(20);d.push_back(30);d.push_front(100);d.push_front(200);d.push_front(300);printdeque(d); // 300 200 100 10 20 30sort(d.begin(), d.end());printdeque(d); // 10 20 30 100 200 300 sort默认升序sort(d.begin(), d.end(), cmp);printdeque(d); // 300 200 100 30 20 10 cmp内为降序
}
int main()
{test01();
}
/*
总结:
sort算法非常实用,使用时包含头文件 algorithm即可
*/

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

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

相关文章

【论文综述+多模态】腾讯发布的多模态大语言模型(MM-LLM)综述(2024.02)

论文链接&#xff1a;24.02.MM-LLMs: Recent Advances in MultiModal Large Language | 国内-链接 实时网站&#xff1a;https://mm-llms.github.io 参考说明1-readpaper:https://mp.weixin.qq.com/s/ESUVe1aTYFLVJ10S9c1dBg 一、什么是MM-LLM ? 多模态大语言模型&#xff…

我写了个ImageWindow应用

文章目录 0 引言1 应用简介2 主要功能和特点2.1 多图像同/异步像素级对比2.2 支持多达30种图像格式2.3 高效率的图像处理性能 3 简明使用教程3.1 软件下载安装与更新3.1.1 软件下载与安装3.1.2 软件更新 3.2 多视窗添加并自动最优排列3.3 多样化图像导入方式3.4 自动切换显示模…

node 之 模块化

1.什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 编程领域中的模块化 编程领域中的模块化&#xff0c;就是遵守固定的规则&#xff0c;把一个大文件拆成独立并…

【力扣 - 只出现一次的数字】

题目描述 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 示例 1 &#xff1a; 输入…

Rocketmq java hello world 入门案例

从零手写实现 mq rocketmq java 入门案例 整体结构 |____src | |____main | | |____java | | | |____com | | | | |____ryo | | | | | |____rocket | | | | | | |____demo | | | | | | | |____common | | | | | | | | |____consumer | | | | | | | | | |____Consumer.java | …

python pandas写入csv

在Python的Pandas库中&#xff0c;可以使用to_csv方法将DataFrame对象写入CSV文件。以下是一个简单的示例&#xff1a; import pandas as pd# 创建一个DataFrame对象 data {Name: [Alice, Bob, Charlie, David],Age: [25, 30, 35, 40],City: [New York, Los Angeles, Chicago…

MySQL统计信息更新

在MySQL使用“采样统计”的方式来维护统计信息。采样统计的时候&#xff0c;InnoDB默认会选择N个数据页&#xff0c;统计这些页面上的不同值&#xff0c;得到一个平均值&#xff0c;然后乘以这个索引的页面数&#xff0c;就得到了这个索引的基数。而数据表是会持续更新的&#…

怎么调用文心一言的api接口生成一个简单的聊天机器人(python代码)

寒假在学习大模型&#xff0c;但也没弄出多少眉目&#xff0c;电脑性能还有点小问题&#xff0c;大模型总跑不起来&#xff0c;只会简单调用一下现有的大模型的接口&#xff0c;例如&#xff1a;文心一言&#xff0c;下面展示一下代码&#xff1a; import tkinter as tk impor…

Postgresql中VACUUM操作原理和应用

VACUUM操作在PostgreSQL中的底层原理涉及几个关键概念&#xff0c;包括MVCC&#xff08;多版本并发控制&#xff09;、事务ID包裹、以及垃圾回收机制。我们逐一解析这些概念&#xff0c;以及它们是如何与VACUUM操作相互作用的。 关键概念 1. MVCC&#xff08;多版本并发控制&…

Mysql安装教程

一、下载 点开下面的链接&#xff1a;https://dev.mysql.com/downloads/mysql/ 点击Download 就可以下载对应的安装包了, 安装包如下: 二、解压 下载完成后我们得到的是一个压缩包&#xff0c;将其解压&#xff0c;我们就可以得到MySQL 8.0.31 的软件本体了(就是一个文件夹…

第三节-docker-cs架构分析

一、组成 docker engine&#xff1a;docker-client、rest-api、dockerd containerd&#xff1a; 1、管理容器生命周期 2、拉取/推送镜像 3、存储管理 4、调用runc 5、管理网络 containerd-shim&#xff1a;相当于一个驱动&#xff0c;containerd通过containerd-shim驱使…

10个SQL查询方法

SQL 是管理和分析关系数据库的基本工具。掌握基本的SQL命令能够完成简单的数据查询和操作&#xff0c;但是如果想从数据中提取更有价值的信息&#xff0c;数据分析工作者和开发人员应该深入学习和掌握高级的SQL技巧。 1 窗口函数 窗口函数是指在SQL查询中对一组相关行进行聚合…

关于静态应用程序安全测试(SAST)的自动修复(AutoFix)

SAST&#xff08;Static Application Security Testing&#xff0c;静态应用程序安全测试&#xff09;具是一种在软件工程中使用的安全解决方案&#xff0c;它主要用于在程序员编写好源代码后&#xff0c;无需经过编译器编译&#xff0c;直接对源代码进行扫描&#xff0c;以找出…

SSM框架,MyBatis框架的学习(下)

MyBatis多表映射 多表结果实体类设计技巧&#xff1a; 对一&#xff0c;属性中包含对方对象 对多&#xff0c;属性中包含对方对象集合 对一查询 对一查询在设计接收多表查询的结果的实体类时&#xff0c;设计一个对方类型的属性即可 查询的结果映射时&#xff0c;如果查询的…

MYSQL05高级_查看修改存储引擎、InnoDB和MyISAM对比、其他存储引擎介绍

文章目录 ①. 查看、修改存储引擎②. InnoDB和MyISAM对比③. Archive引擎 - 归档④. Blackhole引擎丢数据⑤. CSV - 引擎⑥. Memory引擎 - 内存表⑦. Federated引擎 - 访问远程表⑧. Merge引擎 - 管理多个MyISAM⑨. NDB引擎 - 集群专用 ①. 查看、修改存储引擎 ①. 查看mysql提…

动态获取权限,文件管理器选择文件,I/O流

AndroidManifest.xml <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"><!-- <uses-permission and…

链表的总结

题目&#xff1a;将26个英文字母储存在链表中 #include <stdlib.h> #include <stdio.h> struct list { char Ach; struct list* next; }; void create( struct list* head , char* ch ) 而这个head是定义在局部函数的变量&#xff0c;当出局部函数的时候&…

Kotlin的各种骚气语法

1.奇怪的中括号? 前几星期在群里见群友问这种是什么鬼,kt中有这种语法吗? 但其实这种是重写的操作符,分别是重写了setter和getter,类似于list[0]1这样 上面的两个方法声明如下: 不过这种语法很容易引起歧义,所以除非很适合的情况下不建议重写 ps:更多的操作符重载参考最下…

uniapp 部署h5,pdf预览

1.hubuilderx 打包h5。 2.上传部署包到服务器。 解压部署包&#xff1a;unzip h5.zip 。 3.nginx配置。 user root; worker_processes 1; #worker_cpu_affinity 0001 0010 0100 1000; #error_log logs/error.log; #error_log logs/error.log notice; error_log /var/l…

【工具类】repo是什么,repo常用命令,repo和git和git-repo的关系

1. repo 1. repo 1.1. repo是什么1.2. 安装1.3. repo 命令 1.3.1. repo help1.3.2. repo init1.3.3. repo sync1.3.4. repo upload1.3.5. repo start1.3.6. repo forall 1.4. mainfest 文件1.5. git-repo简介(非android repo)1.6. 参考资料 1.1. repo是什么 Repo 是一个 go…