【C++】deque的用法

这篇具有很好参考价值的文章主要介绍了【C++】deque的用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、容器适配器

在了解deque前,我们先讲一讲什么是适配器。

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。 就像我们生活中常见的充电器一样。
【C++】deque的用法
在STL中,虽然stack、queue和priority_dueue中也可以存放元素,但是并没有将其划分在容器的行列中去,而是将其称为容器适配器,这就是因为stack、queue和priority_dueue中只是对其他容器的接口进行了包装。并且,在STL中stack和queue默认使用的是deque,priority_dueue默认使用的是vector。
【C++】deque的用法

【C++】deque的用法

【C++】deque的用法

二、deque的介绍

deque:即双端队列,是一种双开口的连续空间的数据结构。可以在头尾两端进行插入和删除操作。并且,时间复杂度为O(1),与vector比较,头插效率高,不需要移动元素;与list比较,空间利用率比较高。
【C++】deque的用法

但是,deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下:
【C++】deque的用法

双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在了deque的迭代器身上,因此deque的迭代器设计就比较复杂,如下图所示:
【C++】deque的用法
那deque又是如何借助其迭代器维护其假想连续的结构呢?
【C++】deque的用法

三、deque的使用及缺陷

1、deque的构造函数

函数名称 功能说明
deque() 无参构造
deque(size_type n, const value_type& val = value_type()) 构造并初始化n个val
deque (InputIterator first, InputIterator last) 使用迭代器进行初始化构造
deque (const deque& x) 拷贝构造

代码演示:

#include <iostream>
#include <deque>
using namespace std;
int main()
{
    int i;
    deque<int> d1;        
    deque<int> d2(4, 50);                       
    deque<int> d3(d2.begin(), d2.end());  
    deque<int> d4(d3);                       
    for (auto e : d4)
    {
        cout << e << " ";//结果:50 50 50 50
    }
    cout << endl;

    int arr[] = { 16,2,77,29 };
    deque<int> d5(arr, arr + sizeof(arr) / sizeof(int));
    deque<int>::iterator it = d5.begin();
    while (it != d5.end())
    {
        cout << *it << ' ';//结果:16 2 77 29
        ++it;
    }
    cout << endl;

    return 0;
}

2、deque的元素访问接口

函数声明 说明
size() 获取数据个数
empty() 判断是否为空
resize() 更该容器大小
front() 访问第一个元素
back() 访问最后一个元素

3、deque的 iterator的使用

函数声明 说明
begin() + end() 获取第一个数据位置的iterator/const_iterator + 获取最后一个数据的下一个位置的iterator/const_iterator
rbegin() + rend() 获取最后一个数据位置的reverse_iterator + 获取第一个数据前一个位置的reverse_iterator

与vector一样是一个随机访问迭代器,而list是一个双向迭代器

4、deque的增删查改

函数名称 功能说明
push_back() 在末尾添加元素
push_front() 在开头插入元素
pop_back() 删除最后一个元素
pop_front() 删除第一个元素
insert() 插入元素
erase() 删除元素
swap() 交换元素
clear() 清空有效元素
operator[] 访问元素

insert / erase 代码演示:

#include <iostream>
#include <deque>
#include <vector>
using namespace std;
void PrintList(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;


    for (int i = 1; i < 6; i++)
    {
        d1.push_back(i); // 1 2 3 4 5
    }

    deque<int>::iterator it = d1.begin();
    ++it;

    it = d1.insert(it, 10);   
    PrintList(d1); // 结果:1 10 2 3 4 5

    d1.insert(it, 2, 20);                     
    PrintList(d1);// 结果:1 20 20 10 2 3 4 5

    it = d1.begin() + 2;
    vector<int> v(2, 30);
    d1.insert(it, v.begin(), v.end());  
    PrintList(d1);// 结果:1 20 30 30 20 10 2 3 4 5

    deque<int> d2;

    for (int i = 1; i <= 10; i++)
    {
        d2.push_back(i); // 1 2 3 4 5 6 7 8 9 10
    }

    d2.erase(d2.begin() + 5);
    PrintList(d2); //结果:1 2 3 4 5 7 8 9 10

    d2.erase(d2.begin(), d2.begin() + 3);
    PrintList(d2); //结果:4 5 7 8 9 10

    return 0;
}

运行结果:
【C++】deque的用法

由上述接口中,可以看出deque是vector和list的结合体,但是实际使用中并不常见,而目前能看到的一个应用就是在STL中用其作为stack和queue的底层数据结构,为什么呢?

4、deque的缺陷

优势

  • 与vector比较,deque头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是比vector高的。
  • 与list比较,其底层是连续空间,空间利用率比较高,不需要存储额外字段。

缺陷:

  • deque并不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多。所以目前能看到的一个应用就是在STL中用其作为stack和queue的底层数据结构。

5、为什么选择deque作为stack和queue的底层默认容器

  • stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可以作为stack的底层容器,比如vector和list都可以
  • queue是先进先出的特殊线性数据结构,只要具有push_back()和pop_front()操作的线性结构,都可以作为queue的底层容器,比如list。

在STL中stack和queue默认选择deque作为其底层容器,主要原因是:

  1. stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。
  2. 在stack中元素增长时,deque比vector的效率高(扩容时不需要搬移大量数据);queue中的元素增长时,deque不仅效率高,而且内存使用率高。

综上所述,stack和queue结合了deque的优点,而完美避开了其缺陷。文章来源地址https://www.toymoban.com/news/detail-476297.html

到了这里,关于【C++】deque的用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】STL之适配器---用deque实现栈和队列

    目录 前言 一、deque  1、deque 的原理介绍  2、deque 的底层结构  3、deque 的迭代器  4、deque 的优缺点   4.1、优点   4.2、缺点 二、stack 的介绍和使用  1、stack 的介绍  2、stack 的使用  3、stack 的模拟实现 三、queue 的介绍和使用  1、queue 的介绍   2、queue 的使用  3、queue 的模

    2024年02月07日
    浏览(53)
  • 【STL】容器适配器stack和queue常见用法及模拟实现

    1.stack介绍及使用 1.1 stack的介绍 stack文档介绍 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 stack是作为容器适配器被实现的,容器适配器是使用特定容器类的封装对象作为其基础容器的类,提供一

    2024年02月06日
    浏览(48)
  • C++ [STL容器适配器]

    本文已收录至《C++语言》专栏! 作者:ARMCSKGT 前面我们介绍了适配器模式中的反向迭代器,反向迭代器通过容器所支持的正向迭代器适配为具有反向迭代功能的迭代器,本节我们介绍STL中另一种适配器: 容器适配器 ! 前面我们提到过STL适配器模式,关于适配器的解释: S

    2024年02月11日
    浏览(44)
  • C++ STL学习之【容器适配器】

    ✨个人主页: 北 海 🎉所属专栏: C++修行之路 🎊每篇一句: 图片来源 A year from now you may wish you had started today. 明年今日,你会希望此时此刻的自己已经开始行动了。 适配器(配接器)是 STL 中的六大组件之一,扮演着轴承、转换器的角色,使得 STL 中组件的使用更为灵活,

    2023年04月22日
    浏览(60)
  • STL stack,queue,deque以及适配器

    下面是stack库中的接口函数,有了前面的基础,我们可以根据函数名得知函数的作用 函数 说明 stack() 构造空栈 empty() 判断栈是否为空 size() 返回栈中元素个数 top 返回栈顶元素 push() 将值从栈顶压入栈内 pop() 在栈顶出栈 栈其实就是一种特殊的 vector ,因此可以使用 vector 模拟实

    2024年02月10日
    浏览(40)
  • 【C++初阶】容器适配器模拟实现栈和队列(附源码)

    其实在使用模板时,我们 不仅可以使用类模板,还可以使用容器模板 ,这就是一个容器适配器,我们可任意给 模板实例化不同的容器,然后就可以使用容器里的接口 。 我们知道,栈可以用数组实现也可以用链表实现,以前在C语言那里,如果我们想要两个底层不同的栈,要

    2024年02月16日
    浏览(50)
  • STL容器适配器 -- stack和queue(使用+实现)(C++)

    栈和队列数据结构+画图分析如果对栈和队列的结构不了解的,可以先看该链接的内容 使用stack时需要头文件 #includestack stack是一种容器适配器,用于具有 后进先出 (LIFO)的环境中。只能从容器的一端(栈顶),执行删除、插入和提取操作。 stack是作为容器适配器实现的,容器

    2024年02月14日
    浏览(63)
  • 【C++】容器适配器之priority_queue & 仿函数

    我们和学习之前的容器一样,可以使用cplusplus官网进行学习:priority_queue文档介绍 priority_queue(优先级队列)是一种容器适配器,它 和queue使用同一个头文件,其底层结构是一个堆,并且默认情况下是一个大根堆,此外,priority_queue也不支持迭代器,这是为了不破坏堆的结构使用

    2024年02月01日
    浏览(45)
  • 【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL)

    文章绑定了VS平台下std::stack和std::queue的源码,大家可以下载了解一下😍 前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,引用 和 内联函数也认识了什么是类和对象以及怎么去new一个 ‘对象

    2024年02月12日
    浏览(46)
  • C++初阶:容器适配器介绍、stack和queue常用接口详解及模拟实现

    介绍完了list类的相关内容后:C++初阶:适合新手的手撕list(模拟实现list) 接下来进入新的篇章,stack和queue的介绍以及模拟: stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 stack是作为容器适配器

    2024年02月19日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包