<a name="rubam"></a>

deque容器基本概念

​Double ended queue​​的简称<br />双端数据,可以对头端进行插入删除操作

  • deque容器的迭代器也是支持随机访问的

deque与vector区别:

  • vector对于头部的插入删除效率低,数据量越大,效率越低
  • deque相对而言,对头部的插入删除速度比vector快
  • vector访问元素时的速度会比deque快,这和两者内部实现有关

 STL-deque容器_赋值

<br />deque内部工作原理:

  • deque内部有一个中控器,维护每段缓冲区的内容,缓冲区中存放真实数据
  • 中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间

 STL-deque容器_deque_02


<a name="Oh0ch"></a>

deque构造函数

  • ​deque<T>deqT;​​//默认构造
  • ​deque(beg, end);​​//构造函数将[beg,end)区间内的元素拷贝给自身
  • ​deque(n, ele);​​//构造函数将n个ele拷贝给自身
  • ​deque(const deque& deq);​​//拷贝构造函数

如果要限制一个容器为只读状态,那么他的迭代器也要发生改变

#include <iostream>
#include<deque>
using namespace std;
//加const,限定只读
void Print(const deque<int>& d)
{
//需要一个只读迭代器,否则会报错:不存在适当转换
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
{
//*it = 10;容器中的数据不可以修改了
cout << *it << endl;
}
}
int main()
{
deque<int>d(10, 9);
Print(d);
return 0;
}

<a name="jvGG7"></a>

deque赋值操作

重载=运算符:

  • ​deque& operator=(const deque& deq);​

assign方式赋值:

  • ​.assign(beg, end);​​//将[beg,end)区间内的数据拷贝赋值给自身
  • ​.assign(n, elem);​​//将n个elem拷贝赋值给自身

deque复制操作与vector相同,需要熟练掌握

#include <iostream>
#include<deque>
using namespace std;
void Print(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(10, 9);
//operator=赋值
deque<int>d2;
d2 = d1;
Print(d2);
//assign赋值
deque<int>d3;
d3.assign(d1.begin(), d1.end());
Print(d3);
d3.assign(2, 3);
Print(d3);
return 0;
}

<a name="YuWyl"></a>

deque大小操作

  • ​.empty();​​//判断容器是否为空
  • ​.size();​​//返回容器中元素的个数
  • ​.resize(int num);​​//重新指定容器的长度为num,若容器变长,则以默认值0填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
  • ​.resize(int num, elem);​​//重新指定容器的长度为num,若容器变长,则以elem值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除

注意与vector的区别:

  • 没有​​.capacity()​​“容量”,因为内部结构没有容量限制,可以无限扩展

deque<int>d(10, 9);
cout << d.size() << endl;//10
d.resize(3);
cout << d.size() << endl;//3
cout << d.empty() << endl;//0

总结:

  • deque没有容器的概念
  • 判断是否为空:​​.empty()​
  • 返回元素个数:​​.size()​
  • 重新制定个数:​​.resize()​​ <a name="bbF44"></a>

deque插入和删除

两端插入操作:

  • ​.push_back(elem);​​//尾插
  • ​.push_front(elem);​​//头插
  • ​.pop_back();​​//尾删
  • ​.pop_front();​​//头删

指定位置操作:

  • ​.insert(pos, elem);​​//在pos位置插入elem元素的拷贝,返回新数据的位置
  • ​.insert(pos, n, elem);​​//在pos位置插入n个elem元素数据,无返回值
  • ​.insert(pos, beg, end);​​//在pos位置插入[beg,end)区间的数据,无返回值
  • ​.clear();​​//清空容器内所有数据
  • ​.eraser(beg,end);​​//删除[beg,end)区间的数据,返回下一个数据的位置
  • ​.erase(pos);​​//删除pos位置的数据,返回下一个数据的位置

注意:

  • 插入和删除提供的位置是迭代器

#include <iostream>
#include<deque>
using namespace std;
void Print(const deque<int>& d)
{
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
deque<int>d;
cout << *d.insert(d.begin(), 1) << endl;
d.insert(d.begin(), d.begin(), d.end());
d.insert(d.begin(), 2, 2);
Print(d);
//删除
deque<int>::iterator it = d.begin();
it += 2;//指向第三个元素
d.erase(d.begin()+2);
Print(d);
return 0;
}

<a name="vJdWW"></a>

deque数据存取

  • ​.at(int idx);​​​//返回索引​​idx​​所指的数据
  • ​operator[];​​​//返回索引​​idx​​所指的数据
  • ​.front();​​//返回容器中第一个元素的数据
  • ​.back();​​//返回容器中最后一个元素的数据

deque<int>d;
for (int i = 0; i < 10; i++)
{
//不能用下标或at添加新元素
d.push_back(i);
}
for (int i = 0; i < 10; i++)
{
cout << d[i] << " ";
}
cout << endl << d.front() << d.back() << endl;

<a name="rgsia"></a>

deque排序操作

​sort(iterator beg, iterator end);​​//对beg和end区间内的元素进行排序

  • 默认的排序规则是升序:从小到大,
  • 对于支持随机访问的迭代器的容器,都可以利用sort算法直接对其排序
  • voctor容器也可以使用sort排序

sort算法非常实用,使用时包含头文件​​algorithm​​即可

#include <iostream>
#include<deque>
#include<algorithm>
using namespace std;
void Print(const deque<int>& d)
{
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
deque<int>d;
for (int i = 0; i < 10; i++)
{
d.push_back(20-i);
}
Print(d);
sort(d.begin(), d.end());
Print(d);
return 0;
}