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;
}
目录
相关文章
|
存储 缓存 自然语言处理
Elasticsearch 内存占用分析及 page cache 监控
Elasticsearch 内存占用相关知识,以及对 lucene 文件的 page cache 进行监控
4300 6
|
11月前
|
SQL 数据采集 数据挖掘
Pandas数据合并:concat与merge
Pandas是Python中强大的数据分析库,提供灵活高效的数据结构和工具。本文详细介绍了Pandas中的两种主要合并方法——`concat`和`merge`。`concat`用于沿特定轴连接多个Pandas对象,适用于简单拼接场景;`merge`则类似于SQL的JOIN操作,根据键合并DataFrame,支持多种复杂关联。文章还探讨了常见问题及解决方案,如索引对齐、列名冲突和数据类型不一致等,帮助读者全面掌握这两种方法,提高数据分析效率。
513 8
|
10月前
|
前端开发 Java 开发工具
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
655 0
|
缓存 Java 应用服务中间件
【高并发优化手段】基于Springboot项目(二)
【高并发优化手段】基于Springboot项目
1278 0
|
前端开发 API 数据库
介绍一下Flask的使用方法
介绍一下Flask的使用方法
|
人工智能 安全 API
【LangChain系列】第十篇:数据保护简介及实践
【5月更文挑战第24天】本文探讨了在使用大型语言模型时保护个人数据的重要性,特别是涉及敏感信息如PII(个人可识别信息)的情况。为了降低数据泄露风险,文章介绍了数据匿名化的概念,通过在数据进入LLM前替换敏感信息。重点讲解了Microsoft的Presidio库,它提供了一个可定制的文本匿名化工具。此外,文章还展示了如何结合LangChain库创建一个安全的匿名化流水线,包括初始化匿名器、添加自定义识别器和操作符,以及在问答系统中集成匿名化流程。通过这种方式,可以在利用LLMs的同时保护数据隐私。
493 0
|
Docker 容器
docker network inspect 查询出来的网络的创建命令是什么
【6月更文挑战第17天】docker network inspect 查询出来的网络的创建命令是什么
231 1
|
Windows
解决telnet不是内部或外部以及验证某个端口是否开放
解决telnet不是内部或外部以及验证某个端口是否开放
253 0
|
SQL 分布式计算 HIVE
Apache Hudi入门指南(含代码示例)
Apache Hudi入门指南(含代码示例)
508 0
|
人工智能 自然语言处理 搜索推荐
营销大模型应用落地,AI广告投手「归一妙计」重新定义营销可能性
归一智能基于「利欧归一」营销领域大模型,训练出了适配各媒体平台投放工作流的AI Agent「归一妙计」,实现8小时内完成万词万创意万落地页。
567 0