首页 > 编程语言 >c++ deque容器

c++ deque容器

时间:2023-11-28 21:23:15浏览次数:34  
标签:deque Right 容器 back c++ push front Left

一、deque介绍

deque(双端队列)是一种索引容器,它包含在#include<deque>头文件中。它与普通的queue队列不同的是,deque可以实现在尾部插入和删除元素。

  • 随机的访问双端队列中的元素,时间复杂度为O(1)
  • 在首部或者尾部插入或删除元素,时间复杂度O(1)
  • 插入和删除元素,是线性的,时间复杂度为O(n)

定义方法为:deque<数据类型>名字

二、deque的基本使用

对于容器而言,基本的操作都相差不大,下面列举一些deque用的比较多的函数。

  • front()
  • back()
  • push_front()
  • push_back()
  • pop_front()
  • pop_back()
  • size()
  • empty()
  • shrink_to_fit()
  • clear()
  • insert()

代码演示:

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

int main(){
    deque<int> dq;
    //先后在首部和尾部插入元素
    dq.push_front(2);
    dq.push_back(1);
    cout << dq.size() << endl;
    //先后弹出首部和尾部的元素
    dq.pop_front();
    dq.pop_back();
    cout << dq.size() << endl;
    
    if(dq.empty()){
        cout << "容器为空" << endl;
    }
    for (int i = 0; i < 10; i++){
        //分别进行头插和尾插
        dq.push_front(i);
        dq.push_back(i);
    }
    cout << "容器首部的元素和尾部的元素分别是:"<< dq.front() << " " << dq.back() << endl;

    for(auto x :dq){//遍历容器,并输出容器中的元素
        cout << x << " ";
    }

    
    dq.clear();//清空容器
    //在容器中使用insert,第一个参数需要是迭代器类型
    dq.insert(dq.begin(), 5);//在容器的首部插入元素5
    
    cout << endl <<dq.front() << endl;
    cout << dq.size();
    return 0;
}

运行结果:

三、基本应用

现在我们要实现一个队列,既能实现在首部和尾部的插入删除,还要实现能够在队列中间插入删除,并且要求时间复杂度是线性的。

那么我们可以使用两个双端队列来实现,一个left,一个right。在合适条件的时候我们让left的尾部等于right的头部或者right的头部等于left的尾部。

这样当我们需要往中间插入或删除的时候就只需要判断left的大小和right的大小既可。

代码演示:

//为了避免定义不明确所以首字母大写
deque<int> Left,Right;

//头部插入
void pushFront(int val){
    Left.push_front(val);
    /*
    当插入元素后如果出现这种情况时
    Left:3,5,6,1,4
    Right:5,1,0
    我们就需要将Left的尾部添加到Right的头部,然后弹出Left的尾部
    这样的操作完之后
    Left:3,5,6,1
    Right:4,5,1,0
    这样的话当我们需要在中间插入或删除时就非常方便
    */ 
    if(Left.size() == Right.size() + 2){
        Right.push_front(Left.back());
        Left.pop_back();
    }
}

//尾部插入
void pushBack(int val){
    Right.push_back(val);
    //原理同上,简单模拟一下既可,主要是让left的大小与right的大小相同,或者left的大小比Right大1
    //因为队列中元素的个数可能是奇数也可能是偶数
    /*
    l:3,5,4,6
    r:5,9,7,3,0
    操作后
    l:3,5,4,6,5
    r:9,7,3,0
    */
    if(Left.size() + 1 == Right.size()){
        Left.push_back(Right.front());
        Right.pop_front();
    }
}

//中间插入
void pushMiddle(int val){
    if(Left.size() + 1 == Right.size()){
        Right.push_front(Left.back());
        Left.pop_back();
    }
    Left.push_back(val);
}

//头部删除
int popFront(){
    if(Left.empty()){//队列为空,无法弹出元素返回-1
        return -1;
    }
    int val = Left.front();
    if(Left.size() + 1 == Right.size()){
        Left.push_back(Right.front());
        Right.pop_front();
    }
    cout << "弹出元素为:" << val << endl;
    return val;
}

//尾部删除
int popBack(){
   if(Left.empty()){
       return -1;
   }
   int val = 0;
   if(Right.empty()){
       val = Left.back();
       Left.pop_back();
   }
   else{
       val = Right.back();
       Right.pop_back();
       if(Left.size() == Right.size() + 2){
           Right.push_front(Left.back());
           Left.pop_back();
       }
   }
   cout << "弹出元素为:" << val << endl;
   return val;
}

//中间删除
int popMiddle(){
    if(Left.empty()){
        return -1;
    }
    int val = Left.back();
    Left.pop_back();
    if(Left.size() + 1 == Right.size()){
        Left.push_back(Right.front());
        Right.pop_front();
    }
    return val;
}

主要的思想是始终要让left的大小等于right的大小,或者让left的大小比right大1。

 

标签:deque,Right,容器,back,c++,push,front,Left
From: https://www.cnblogs.com/linx000/p/17862789.html

相关文章

  • C++中的红黑树学习
    C++中有一种数据结构-红黑树,在C++的STL中有一种数据结构map,它就是基于红黑树来实现的红黑树,是一种二叉搜索树,但是它的每个节点都有颜色,并且只有红和黑两种颜色。所以每个节点上都有一个存储位来表示节点的颜色,可以是Red和Black.红黑树有一个很大的特点: 它能够确保没有任何一......
  • kubernetes集群使用容器镜像仓库Harbor
    1、容器镜像仓库Harbor部署在docker主机部署Harbor,安装过程比较简单在k8s集群中部署Harbor2、使用Harbor仓库2.1通过secret使用Harbor仓库新建私有仓库集权所有节点配置harbor仓库#cat/etc/docker/daemon.json{"exec-opts":["native.cgroupdriver=system......
  • docker-compose种不通的服务之间的访问问题,夸容器访问
    背景我们知道对于docker的每个容器都是独立的,想要夸容器访问的话,不能用127.0.0.1加端口号去访问,所以需要docker虚拟网卡的网关分配的地址去访问,可以通过dockerinspect对每个容器的局域网ip进行查看,但是这样比较麻烦,所以有一个新的解决办法,就是通过docker-compose配置文件的方......
  • Spring配置文件的魔法炼金术:如何制造容器化时代的完美配方
    前言基于现代服务的云原生十二要素理论,我们在采用容器化部署时,要保证同一个镜像可以满足不同环境的部署要求,而不是不同环境打包不同的镜像。本文档主要介绍一种基于spring框架的满足不同环境配置的编译打包方案,满足同一个镜像可以在环境分组下通过启动项配置实现不同环境的部署。......
  • arthas 热更新docker容器中的代码
    1、将修改并编译好的class文件复制到docker容器中dockercpBasicController.classarthas-demo:/将文件BaseiController.class复制到arthas-demo容器根目录下BaseiController.class:编译后的代码arthas-demo:容器名 2、进入容器,运行arthas参见:地址 3、替换文件ret......
  • C++ Primer 学习笔记——第十三章
    第十三章拷贝控制前言类是如何控制类型对象的拷贝、赋值、移动和销毁的?类通过一些特殊的成员函数控制,包括:拷贝构造函数、移动构造函数、拷贝赋值运算符、移动赋值运算符以及析构函数。当定义一个类时,我们显式地或隐式的指定在此类型的对象拷贝、移动、赋值和销毁时做什么。一......
  • C++17 更通用的 union:variant
    References现代C++学习——实现多类型存储std::variant如何优雅的使用std::variant与std::optionalstd::variant是C++17中,一個新加入標準函式庫的template容器;他的概念基本上是和union(參考)一樣,是一個可以用來儲存多種型別資料的容器。比如說:std::variant<int,d......
  • C++U4-第06课-二分答案
    上节课作业解析链接:https://pan.baidu.com/s/1QCDg1GXb5HhrpkPgomOCyg?pwd=s4b4提取码:s4b4二分答案学习目标二分查找单调性意思 二分答案单调性 二分答案的思路[【二分答案】砍树(简单版)]枚举每一棵树,注意当锯片高度高于树的高度时砍的树木是0。#include<io......
  • C++ bool 类型
    @TOC一.bool类型在C++中,bool类型用于表示逻辑值,它只有两个可能的取值:true(真)和false(假)。bool类型常用于条件判断和布尔运算中。C++标准要求bool类型占用一个字节的内存空间。它的取值只能是true或false,并且可以通过关键词true和false直接赋值。下面是一些常见的使......
  • C++获取机器启动至今的时长和机器启动的时间戳
    根据当前时间戳与机器启动至今的时间长度相减,可以精确计算出机器启动时刻的时间戳epochtime代码#include<iostream>#include<stdio.h>#include<time.h>#include<chrono>intmain(){#ifdef__linux //linuxonly std::cout<<"===linuxonlytimeanalysis==......