首页 > 其他分享 >deque

deque

时间:2024-08-20 15:16:33浏览次数:11  
标签:deque 容器 元素 vector words include

deque

deque<T>,一个定义在 deque 头文件中的容器模板,可以生成包含 T 类型元素的容器,它以双端队列的形式组织元素。可以在容器的头部和尾部高效地添加或删除对象,这是它相对于 vector 容器的优势。

创建

#include <algorithm>
#include <string>
#include <deque>

using namespace std;

int main() {
    // 默认的构造函数生成 deque 容器,容器中没有任何元素,因此添加第一个元素,就会导致内存的分配
    deque<int> data1;
    // 生成给定元素个数的 deque 容器,每个元素保存的都是这种元素类型的默认值
    deque<int> data2(10);
    // 用初始化列表来生成 deque 容器
    deque<string> words{"one", "none", "some", "all", "none", "most", "many"};

    // 生成现有容器的副本
    deque<string> words_copy{words};
    // 由两个迭代器标识的一段元素来初始化它,作为初始值的一段元素,可以来自任何种类的容器,不需要一定是 deque
    // 这个容器有 5 个元素,它们和 words 容器的前 5 个元素相等
    deque<string> words_part{begin(words), begin(words) + 5};
}

访问

deque 容器中的元素是序列,但是内部的存储方式和 vector 不同。它组织元素的方式导致容器的大小总是和容量相等。因此没有定义成员函数 capacity(),deque 只有成员函数 size(),它以成员类型 size_type 的无符号整型来返回当前元素个数。

可以用下标运算符来访问元素,但是索引并没有进行边界检查。为了用进行边界检查的索引来访问元素,可以选择使用成员函数 at(),这和 vector 相同。

deque 成员函数 front()back() 的用法也和 vector 相同,然而,deque 却没有成员函数 data(),因为元素并没有被存放在数组中。deque 容器和 vector 一样,有三种不同重载版本的 resize() 函数,它们的操作基本相同。

添加和删除

deque 和 vector 都有成员函数 push_back() 和 pop_back(),它们在序列尾部添加或删除元素的方式相同。deque 也有成员函数 push_front() 和 pop_front(),可以在序列头部执行相似的操作。

除了和 vector —样都有 emplace_back() 函数外,deque 还有成员函数 emplace_front(),可以在序列的开始位置生成新的元素。和 vector 一样,也可以使用 emplace() 或 insert() 在 deque 内部添加或移除元素。这个过程相对要慢一些,因为这些操作需要移动现有的元素。

关于 vector 容器的所有 insert() 函数也同样适用于 deque 容器。在 deque 的任意位置插入一个元素会让现有的迭代器全部失效,因此需要重新生成它们。deque 的成员函数 erase() 也和 vector 的相同,它的成员函数 clear() 可以移除一些元素。

修改

#include <algorithm>
#include <string>
#include <deque>
#include <iostream>
#include <vector>

using namespace std;

int main() {
    deque<string> words{"one", "two", "three", "four"};
    auto init_list = {string{"seven"}, string{"eight"}, string{"nine"}};

    // 1.用 init_list 中的 string 对象替换掉了 words 中的元素
    /*
     * 这里不能直接把字符放入初始化列表。
     * 如果这么做,init_list 的类型会被推导为 initializer_list<const char*>,
     * 然而 assign() 需要的是一个 initializer_list<string> 类型的实参,这样就无法通过编译。
     */
    words.assign(init_list);
    // 也可以不单独定义 init_list,可以在 assign() 的实参中定义初始化列表
    // words.assign({"seven", "eight", "nine"});
    // deque: seven eight nine

    // 2.提供两个迭代器作为参数
    vector<string> wordSet{"this", "that", "these", "those"};
    words.assign(begin(wordSet) + 1, end(wordSet) - 1);
    // deque: that these

    // 3.用重复的对象来替换容器中的内容
    words.assign(2, "two");
    // deque: two two

    // 为 deque 替换一套新元素
    // otlier_words 会包含和 words 相同的元素,words 则包含初始化列表中的那些元素
    deque<string> other_words;
    other_words = words;
    words = {"seven", "eight", "nine"};
}

标签:deque,容器,元素,vector,words,include
From: https://www.cnblogs.com/sprinining/p/18369464

相关文章

  • JAVA中实现队列和栈(Deque接口和ArrayDeque类)
    用什么来实现队列和栈首先JAVA中有一个Queue接口,用来实现队列。Deque其实就是双端队列,代表两端都可进可出的队列。ArrayDeque就是用数组来实现这个双端队列。(Deque由于是接口,只可以用于声明对象,但是没办法实例化,实例化还是要使用ArrayDeque类)这时可能就会产生疑惑,队列有了,......
  • STL用法总结(二)(deque,map,set)
    4.deque(双端队列)1.介绍首尾都可插入和删除的队列为双端队列#include<deque>//初始化定义deque<int>dq;2.方法函数代码含义q.push_back(x)/pusu_front(x)把x插入队尾/队首q.back()/front()返回队尾/队首元素q.pop_back()/pop_front()删除队尾/队首元素q.erase(ite......
  • C++queue,deque浅显了解及运用(信息学竞赛专用)
    当然也可以不看==> 阅读我的文章前请务必先阅读此文章! 都是废话目录阅读文章须知引言队列(queue)队列简介​编辑队列的创建队列的操作手写队列双端队列(deque)双端队列简介双端队列的创建双端队列的操作 手写双端队列(原理)写在最后阅读文章须知为了得到......
  • [C++初阶]deque的讲解
    1.deque介绍          Deque是双端队列的不规则缩写。双端队列是具有动态大小的序列容器,可以在两端扩展或收缩。特定的库可能以不同的方式实现deque,通常是某种形式的动态数组。在任何情况下,它们都允许通过随机访问迭代器直接访问单个元素,并根据需要通过扩展和收缩......
  • ArrayDeque
    ArrayDeque又实现了Deque接口(Deque又实现了Queue接口)publicclassArrayDeque<E>extendsAbstractCollection<E>implementsDeque<E>,Cloneable,Serializable{}Deque与Queue相对应的接口QueueMethodEquivalentDequeMeth......
  • 区间DP专栏 第一章(双色马、神医胡青牛、Deque等)
    #A.神医胡青牛题目描述胡青牛是“倚天屠龙记”中的神医(但从此题目看出很贪财),每天都有N多(N<=2000)的人来求他治病,这些人排成一队,从1开始编号直到N,每个人手里都拿着一个牌子,其上的值用Ai(1<=i<=N,1<=ai<=1000)代表,表示自己愿意付给胡大牛多少钱做为酬金。胡神医每次从队......
  • C++双端队列deque源码的深度学习(stack,queue的默认底层容器)
    什么是deque?deque是C++标准模板库(STL)中的一个容器,代表“双端队列”(double-endedqueue)。deque支持在其前端(front)和后端(back)进行快速插入和删除操作,并且它在序列的中间插入和删除元素时通常比vector或list更高效。deque的特点双端插入和删除:你可以在deque的头部和尾部快速......
  • C++中的priority_queue和deque以及适配器
    C++中的priority_queue和deque一丶priority_queue1.1priority_queue的介绍1.2priority_queue的使用1.3priority_queue的模拟实现二丶deque2.1deque的简单介绍2.2deque的缺陷2.3为什么要选择deque作为stack和queue的迭代器三丶容器适配器3.1什么是适配器3.2S......
  • 深入理解 C++ 的 deque 容器
    一、deque概述vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。所谓双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,如下所示。vector也可以在头尾两端进行操作,但是其头部操作效率奇差,无法被接受。deque和vector的最大差异,一在于deque允许......
  • deque容器
    deque和vector的最大差异一在于deque允许常数时间内对头端或尾端进行元素的插入或移除操作。二在于deque没有所谓的容量概念,因为它是动态地以分段连续空间组合而成随时可以增加一块新的空间并拼接起来。虽然deque也提供随机访问的迭代器,但它的迭代器和vector、list容器的......