5.4 STL deque双端队列

101 阅读4分钟

STL-deque双端队列

[TOC]

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没有容量的观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。

参考资料

zhuanlan.zhihu.com/p/583038985