黑马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 9
  deque<int> d2(d1.begin(), d1.end()); // 区间构造
  printdeque(d2);                      // 0 1 2 3 4 5 6 7 8 9
  deque<int> d3(3, 100);               // n个element
  printdeque(d3);                      // 100 100 100
  deque<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 9
  deque<int> d2;
  d2 = d1;        //=赋值
  printdeque(d2); // 0 1 2 3 4 5 6 7 8 9
  deque<int> d3;
  d3.assign(d1.begin(), d1.begin() + 3); // assign  (左闭右开)
  printdeque(d3);                        // 0 1 2
  deque<int> d4;
  d4.assign(3, 100); // assign,n个element
  printdeque(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 9
  if (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 0
  d1.resize(16, 111);
  printdeque(d1); // 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 111
  d1.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
  // 两端操作
  // insert
  d1.insert(d1.begin() + 1, 1000); // pos为迭代器
  printdeque(d1);                  // 200 1000 100 1 2
  d1.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 2
  d1.erase(d1.begin() + 1, d1.end()); // 删除区间元素
  printdeque(d1);                     // 2
  int 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;
  // 通过at
  for (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;
  else
    return 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 30
  sort(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即可
*/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录训练营第31天 | 理论基础、LeetCode 455.分发饼干、

目录 理论基础 视频讲解&#xff1a;手把手带你学会操作链表 | 贪心算法理论基础&#xff01;_哔哩哔哩_bilibili LeetCode 455.分发饼干 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;贪心算法&#xff0c;你想先喂哪个小孩&#xff1f;| Le…

Linux Shell脚本练习(一)

一、 Linux下执行Shell脚本的方式&#xff1a; 1、用shell程序执行脚本&#xff1a; a、根据你的shell脚本的类型&#xff0c;选择shell程序&#xff0c;常用的有sh&#xff0c;bash&#xff0c;tcsh等 b、程序的第一行#!/bin/bash里面指明了shell类型的&#xff0c;比如#!/…

Docker部署ROS程序

【先上干货】 1、docker安装 curl -fsSL https://test.docker.com -o test-docker.shsudo sh test-docker.sh# ubuntu系统可以直接通过apt安装 sudo apt-get install -y docker.io 2、给docker一个root权限 sudo usermod -aG docker $USER3、启动docker服务 # service 命令…

Windows文件管理器居然提示要登录,还要开通会员才能使用?

前几天有个朋友找到小白&#xff0c;说他装了个假的Windows系统。 啥&#xff1f;Windows还有假的吗&#xff1f;那这个高仿的水准可就高了。 她说她电脑里的文件管理器突然提示她要登录&#xff0c;还要开通会员才能使用全部功能。 这可把她急坏了&#xff0c;问我说要不要支…

JMETER与它的组件们

os进程取样器 这个取样器可以让jmeter直接调用python写的测试数据 这样就可以调用python写的测试数据给到jmeter进行调用 注意&#xff1a;1建议python返回转json格式dumps一下&#xff1b;2py文件中需要把结果打印出来&#xff0c;可以不用函数直接编写 传到jmeter之后可以用…

智慧应急:构建全方位、立体化的安全保障网络

一、引言 在信息化、智能化快速发展的今天&#xff0c;传统的应急管理模式已难以满足现代社会对安全保障的需求。智慧应急作为一种全新的安全管理模式&#xff0c;旨在通过集成物联网、大数据、云计算、人工智能等先进技术&#xff0c;实现对应急事件的快速响应、精准决策和高…

复盘丁磊造车危机:超10亿美金融资搁浅,高合等待救援

作者 |祥威 编辑 |德新 2024年春节过后&#xff0c;新造车公司华人运通宣布停工停产&#xff0c;等待最后救援。 华人运通由丁磊创办于2017年&#xff0c;2019年发布高合HiPhi &#xff0c;定位「豪华智能纯电品牌」&#xff0c;至今推出的量产车型有高合HiPhi X、Z、Y。 丁…

MATLAB环境下使用相关图可视化相关矩阵

为了处理各行各业中出现的高维数据&#xff0c;迫切需要寻找适用的统计学方法。大维随机矩阵理论是处理高维数据的理论工具之一&#xff0c;在高维统计分析中&#xff0c;表现出良好的性能并有着广泛的应用。 二十世纪四十年代和五十年代初期&#xff0c;大维随机矩阵理论起源…

377组合总和 Ⅳ

题目 给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。示例 1&#xff1a;输入&#xff1a;nums [1,2,3], target 4 输出&#xff1a;7 解释&…

模型选择与评估

&#x1f6a9; 机器学习的一般流程包括&#xff1a;数据集的准备与预处理、搭建模型、模型训练、模型评估与应用。 在现实任务中&#xff0c;我们往往有多种学习算法可供选择&#xff0c;甚至对同一个学习算法&#xff0c;当使用不同的参数配置时&#xff0c;也会产生不同的模型…

@Slf4j 变量log找不到符号,可能是 Gradle 配置文件写得有问题

Slf4j 变量log找不到符号 鄙人在学习 Java 的 spring boot 项目时, 常常因为 maven 配置文件使用 xml 格式过于复杂, 所以更倾向于使用 gradle 作为构建工具. 然而, 在使用 gradle 作为构建工具时, 又需要引用 Lombok 依赖. 有时忘记在初始化项目时添加上 Lombok 依赖, 所以经…

源码安装nginx保姆级教程

一.目录存放 1./usr/lib/syste,md/system/:每个服务最主要的启动脚本设定 2. /run/systemd/system/&#xff1a;系统执行过程中所产生的服务脚本&#xff0c;这些脚本的优先序要比 /usr/lib/systemd/system/ 高&#xff01; 3./etc/systemd/system/&#xff1a;管…

力扣:9. 回文数

力扣&#xff1a;9. 回文数 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&#xf…

【Redis | 第一篇】快速了解Redis

文章目录 1.快速了解Redis1.1简介1.2与其他key-value存储的不同处1.3Redis安装——Windows环境1.3.1下载redis1.3.2启动redis1.3.3进入redis客户端1.3.4修改配置 1.4Redis安装——Linux环境1.4.1安装命令1.4.2启动redis1.4.3进入redis客户端 1.5配置修改1.6小结 1.快速了解Redi…

开源项目:图像分类技术在医疗影像分析中的应用与实践

一、引言 在当今快速发展的医疗行业中&#xff0c;数字医疗正逐渐成为提升医疗服务质量和效率的关键力量。本项目旨在通过整合医药电商、远程问诊、慢病管理等多维度服务&#xff0c;为消费者和企业提供全面的医疗解决方案。项目的核心在于运用先进的图像分类技术&#xff0c;以…

开工大吉,接单助你!

新年的气息逐渐散去&#xff0c;打工人重返岗位&#xff0c;开启新一年的搬砖&#xff01; 虽说&#xff0c;个个都叫嚷着“这个班是非上不可不可嘛&#xff1f;&#xff01;”但不少人新年的第一条朋友圈却是“开工大吉”。好吧&#xff0c; 在生活和金钱的威逼利诱下&#…

OSCP靶场--Shenzi

OSCP靶场–Shenzi 考点(1.目录扫描&#xff1a;可以尝试使用多个工具(扫描不出来任何东西&#xff0c;可以结合机器名拼接url 2.WP 目标插入webshell getshell 3.windows环境AlwaysInstallElevated提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC -p- …

云呐智能运维包含哪些内容?运维未来的发展方向是什么?

智能运维&#xff08;AIOps&#xff09;是一种使用人工智能应用程序来调节IT操作和维护的实践方式。它结合了大数据和机器学习技术&#xff0c;旨在自动化和改进IT操作和维护任务&#xff0c;如故障检测、因果分析和自动故障修复。以下是智能操作和维护的具体内容、挑战和解决方…

ANTLR4规则解析生成器(三):遍历语法分析树

文章目录 1 词法分析2 语法分析3 遍历语法分析树3.1 Listener3.2 Visitor 4 总结 1 词法分析 词法分析就是对给定的字符串进行分割&#xff0c;提取出其中的单词。 在antlr4中&#xff0c;词法规则的名称的首字母需要大写&#xff0c;右侧必须是终结符&#xff0c;通常将词法…

unity自定义着色器基础

这些内置渲染管线的着色器示例演示了编写自定义着色器的基础知识&#xff0c;并涵盖了常见的用例。 有关编写着色器的信息&#xff0c;请参阅编写着色器。 设置场景 第一步是创建一些用于测试着色器的对象。在主菜单中选择 Game Object > 3D Object > Capsule。然后&a…