首页 > 其他分享 >STL-deque双端队列

STL-deque双端队列

时间:2024-01-22 20:01:26浏览次数:40  
标签:容器 迭代 deque STL 双端 元素 back push

STL-deque双端队列

目录

deque 是 double-ended queue 的缩写,又称双端队列容器,可以对其两段的数据进行操作,因为它没有capacity属性,因此不会像vector那样”旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间”,因此,deque没有必须要提供所谓的空间保留(reserve)功能。

vector是单向开口的连续线性空间,但deque一种双向开口的连续线性空间

deque 容器也擅长在序列头部  和  尾部添加或删除元素

创建初始化

deque()						//创建一个空deque。
deque(int nSize)			//创建一个deque,元素个数为nSize。
deque(int nSize,const T& t) //创建一个deque,元素个数为nSize,且值均为t。
deque (const deque &.)		 //复制构造函数。
#include <deque>
using namespace std;

std::deque<int> d;   		//空 deque 容器
std::deque<int> d(10, 5)   // 创建了一个包含 10 个元素(值都为 5)
    
//拷贝普通数组,创建deque容器
int a[] = { 1,2,3,4,5 };
std::deque<int>d(a, a + 5);
//适用于所有类型的容器
std::array<int, 5>arr{ 11,12,13,14,15 };
std::deque<int>d(arr.begin()+2, arr.end());  //拷贝arr容器中的{13,14,15}

插入元素

void push_front(const T& x):双端队列头部增加一个元素x。
void push_back(const T&. x):双端队列尾部增加一个元素x。
#include <iostream>
#include <deque>
using namespace std;
int main()
{
   // 初始化一个空deque容量
   deque<int> d;
   // 向d容器中的尾部依次添加 1,2,3
   d.push_back(1); //{1}
   d.push_back(2); //{1,2}
   d.push_back(3); //{1,2,3}
   // 向d容器的头部添加 0
   d.push_front(0); //{0,1,2,3}
   // 调用 size() 成员函数输出该容器存储的字符个数。
   cout << "deque size:" << d.size() << endl;

   // 使用迭代器遍历容器
   for (auto i = d.begin(); i < d.end(); i++)
   {
      cout << *i << " ";
   }
   cout << endl;
   return 0;
}

//deque size:4
//0 1 2 3

删除元素

void pop_front() //删除双端队列中最前一个元素。
void pop_back()	//删除双端队列中最后一个元素。
void clear()	//删除双端队列中所有元素。

遍历容器

#include <iostream>
#include <deque>

using namespace std;

int main()
{
   deque<int> d(3); //{0,0,0}
   d.push_back(10);
   d.push_back(20);
   d.push_back(30);
   cout << "original deque: ";
   for (int i = 0; i < d.size(); i++)
   {
      cout << d[i] << ",";
   }
   cout << endl;

   d.push_back(5);
   d.push_back(3);
   d.push_back(1);
   cout << "after push_front(5,3,1): ";
   for (int i = 0; i < d.size(); i++)
   {
      cout << d.at(i) << ",";
   }
   cout << endl;
   d.pop_front();
   d.pop_front();
   d.pop_back();
   cout << "after  pop_front and pop_back ";
   for (int i = 0; i < d.size(); i++)
   {
      cout << d.at(i) << ",";
   }
   cout << endl;
}

// original deque: 0,0,0,10,20,30,
// after push_front(5,3,1): 0,0,0,10,20,30,5,3,1,
// after  pop_front and pop_back 0,10,20,30,5,3,

函数总览

函数成员 函数功能
迭代器 begin() 返回指向容器中第一个元素的迭代器。
迭代器 end() 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。
迭代器 rbegin() 返回指向最后一个元素的迭代器。
迭代器 rend() 返回指向第一个元素所在位置前一个位置的迭代器。
迭代器 cbegin() 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
迭代器 cend() 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
迭代器 crbegin() 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
迭代器 crend() 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
容量 size() 返回实际元素个数。
容量 max_size() 返回容器所能容纳元素个数的最大值。这通常是一个很大的值,一般是 232-1,我们很少会用到这个函数。
resize() 改变实际元素的个数。
容量 empty() 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
shrink _to_fit() 将内存减少到等于当前元素实际所使用的大小。
元素访问 at() 使用经过边界检查的索引访问元素。
元素访问 front() 返回第一个元素的引用。
元素访问 back() 返回最后一个元素的引用。
assign() 用新元素替换原有内容。
修改器 push_back() 在序列的尾部添加一个元素。
修改器 push_front() 在序列的头部添加一个元素。
修改器 pop_back() 移除容器尾部的元素。
修改器 pop_front() 移除容器头部的元素。
修改器 insert() 在指定的位置插入一个或多个元素。
修改器 erase() 移除一个元素或一段元素。
修改器 clear() 移出所有的元素,容器大小变为 0。
修改器 swap() 交换两个容器的所有元素。
emplace() 在指定的位置直接生成一个元素。
emplace_front() 在容器头部生成一个元素。和 push_front() 的区别是,该函数直接在容器头部构造元素,省去了复制移动元素的过程。
emplace_back() 在容器尾部生成一个元素。和 push_back() 的区别是,该函数直接在容器尾部构造元素,省去了复制移动元素的过程。
和 vector 相比,额外增加了实现在容器头部添加和删除元素的成员函数,同时删除了 capacity()、reserve() 和 data() 成员函数。

deque和vector

1、deque能够在常数时间在头端插入和删除元素;
2、deque没有容量的观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。

参考资料

https://zhuanlan.zhihu.com/p/583038985

标签:容器,迭代,deque,STL,双端,元素,back,push
From: https://www.cnblogs.com/tian777/p/17980861

相关文章

  • STL-Set集合
    STL-Set集合目录STL-Set集合导入构造插入删除查找元素遍历元素成员方法multisetunordered_set参考资料set集合unordered_set无序集合set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。set不允许两个元素有相同的键值。不允许出现相同的两个se......
  • STL-map/unordered_map映射
    STL-map/unordered_map映射目录STL-map/unordered_map映射1.构造初始化2.数据插入3.数据查找4.迭代器遍历5.删除和清空6.成员方法7.multimap8.unordered_map9.unordered_multimap10.底层原理11.总结12.参考资料键值对容器Map映射是一种类似于字典的数据结构。它是(键,值)对的序......
  • STL—函数对象
    函数对象概念1、重载函数调用操作符的类,其对象常称为函数对象2、函数对象使用重载的()时,行为类似函数调用,也叫仿函数本质函数对象(仿函数)是一个类,不是一个函数函数对象的使用特点:1、函数对象在使用时,可以像普通函数那样调用,也可以有参数,可以有返回值2、函数对象超出普通函数的概念,函......
  • 解决latex在使用lstlisting环境时的Undefined control sequence.错误
    错误描述,如题,Undefinedcontrolsequence.\begin{lstlisting},查了不少的资料,起始就是一句话,缺了宏包的导入。先看代码:\documentclass[11pt,a4paper]{ctexart}\usepackage{listings}%插入代码要引入的宏包\author{gsc}\title{sample}\lstset{columns=fixed,......
  • STL(下)
    deque容器基本概念功能:双端数组,可以对头端进行插入删除操作deque与vector区别:1.vector对于头的插入删除效率低,数据量越大,效率越低2.deque相对而言,对头部的插入删除速度会比vector快3.vector访问元素时的速度会比deque快,这和两者内部实现有关。deque内部工作原理:deque内部有个中控器......
  • C++ STL标准模板库
    目录简介容器(Containers)迭代器(Iterators)算法(Algorithms)函数对象(FunctionObjects)适配器(Adaptors)分配器(Allocators)std::min_element()简介C++中的STL(标准模板库)可以分为六个部分,分别是容器(Containers)、迭代器(Iterators)、算法(Algorithms)、函数对象(FunctionObjects)、适配器(Adapto......
  • 聊一聊为什么我要整合Microsoft.Extensions.DependencyInjection和Castle.Core
    前言如果用到动态代理,大家可能会有几种选择,排到前列的是Autofac+Castle、AspectCore和DoraInterception,我将从我当时研究的经历,以及我遇到的场景,为大家展示下聊一聊我为什么要费时费力的整合Microsoft.Extensions.DependencyInjection和Castle.Core当时遇到的场景直接上源码......
  • fastlio工程化工作
    fastliofastlio2pointlio都是港大开源的很好的工作其中fastlio2是对fastlio的升级 没有使用特征提取使用gicp方式做点到面的约束pointlio没有使用迭代卡尔曼滤波方式进行优化也没有做针对scan的运动补偿而是针对scan中的每一个点的时间都做了观测。针对激光建图来说fas......
  • 聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(完结篇)
    聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(完结篇) 合集-聊一聊如何整合Microsoft默认的Ioc容器和Castle.Core(4) 1.聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(二)01-122.聊一聊如何结合Microsoft.Extension......
  • 聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(三)
    聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(三) 合集-聊一聊如何整合Microsoft默认的Ioc容器和Castle.Core(4) 1.聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(二)01-122.聊一聊如何结合Microsoft.Extensions.De......