STL-deque容器

简介: STL-deque容器

deque容器基本概念

Double ended queue的简称

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

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

deque与vector区别:

  • vector对于头部的插入删除效率低,数据量越大,效率越低
  • deque相对而言,对头部的插入删除速度比vector快
  • vector访问元素时的速度会比deque快,这和两者内部实现有关

deque内部工作原理:

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

deque构造函数

  • deque<T>deqT;//默认构造
  • deque(beg, end);//构造函数将[beg,end)区间内的元素拷贝给自身
  • deque(n, ele);//构造函数将n个ele拷贝给自身
  • deque(const deque& deq);//拷贝构造函数

如果要限制一个容器为只读状态,那么他的迭代器也要发生改变

#include <iostream>
#include<deque>
using namespace std;
//加const,限定只读
void Print(const deque<int>& d)
{
    //需要一个只读迭代器,否则会报错:不存在适当转换
    for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
    {
        //*it = 10;容器中的数据不可以修改了
        cout << *it << endl;
    }
}
int main()
{
    deque<int>d(10, 9);
    Print(d);
    return 0;
}

deque赋值操作

重载=运算符:

  • deque& operator=(const deque& deq);

assign方式赋值:

  • .assign(beg, end);//将[beg,end)区间内的数据拷贝赋值给自身
  • .assign(n, elem);//将n个elem拷贝赋值给自身

deque复制操作与vector相同,需要熟练掌握

#include <iostream>
#include<deque>
using namespace std;
void Print(const deque<int>& d)
{
    for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
int main()
{
    deque<int>d1(10, 9);
    //operator=赋值
    deque<int>d2;
    d2 = d1;
    Print(d2);
    //assign赋值
    deque<int>d3;
    d3.assign(d1.begin(), d1.end());
    Print(d3);
    d3.assign(2, 3);
    Print(d3);
    return 0;
}

deque大小操作

  • .empty();//判断容器是否为空
  • .size();//返回容器中元素的个数
  • .resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值0填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
  • .resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除

注意与vector的区别:

  • 没有.capacity()“容量”,因为内部结构没有容量限制,可以无限扩展
deque<int>d(10, 9);
cout << d.size() << endl;//10
d.resize(3);
cout << d.size() << endl;//3
cout << d.empty() << endl;//0

总结:

  • deque没有容器的概念
  • 判断是否为空:.empty()
  • 返回元素个数:.size()
  • 重新制定个数:.resize()

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();//清空容器内所有数据
  • .eraser(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置
  • .erase(pos);//删除pos位置的数据,返回下一个数据的位置

注意:

  • 插入和删除提供的位置是迭代器
#include <iostream>
#include<deque>
using namespace std;
void Print(const deque<int>& d)
{
    for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
int main()
{
    deque<int>d;
    cout << *d.insert(d.begin(), 1) << endl;
    d.insert(d.begin(), d.begin(), d.end());
    d.insert(d.begin(), 2, 2);
    Print(d);
    //删除
    deque<int>::iterator it = d.begin();
    it += 2;//指向第三个元素
    d.erase(d.begin()+2);
    Print(d);
    return 0;
}

deque数据存取

  • .at(int idx);//返回索引idx所指的数据
  • operator[];//返回索引idx所指的数据
  • .front();//返回容器中第一个元素的数据
  • .back();//返回容器中最后一个元素的数据
deque<int>d;
for (int i = 0; i < 10; i++)
{
    //不能用下标或at添加新元素
    d.push_back(i);
}
for (int i = 0; i < 10; i++)
{
    cout << d[i] << " ";
}
cout << endl << d.front() << d.back() << endl;

deque排序操作

sort(iterator beg, iterator end);//对beg和end区间内的元素进行排序

  • 默认的排序规则是升序:从小到大,
  • 对于支持随机访问的迭代器的容器,都可以利用sort算法直接对其排序
  • voctor容器也可以使用sort排序

sort算法非常实用,使用时包含头文件algorithm即可

#include <iostream>
#include<deque>
#include<algorithm>
using namespace std;
void Print(const deque<int>& d)
{
    for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
int main()
{
    deque<int>d;
    for (int i = 0; i < 10; i++)
    {
        d.push_back(20-i);
    }
    Print(d);
    sort(d.begin(), d.end());
    Print(d);
    return 0;
}
目录
相关文章
|
1月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
262 77
|
11天前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
83 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
1月前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
22天前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
11天前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
74 11
|
28天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
134 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
1月前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
59 3
实战~如何组织一个多容器项目docker-compose
|
1月前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
141 3
|
2月前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
83 14
|
1月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
160 7

热门文章

最新文章