STL-deque双端队列

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

posted @ 2024-01-22 19:59  贝壳里的星海  阅读(8)  评论(0编辑  收藏  举报