deque容器
- 'double-ended queue’的缩写,和vector一样都是STL的容器
- deque是双端数组,可以对头部进行插入删除操作,相较于vector多了头插头删的操作以及front()和back(),后面这两个分别表示容器的第一个元素和最后一个元素,并不是迭代器,调用会得到具体值
deque与vector的区别:
- vector对于头部的插入删除效率低,数据量越大,效率越低
- deque相对而言,对头部的插入删除速度会比vector快
- vector访问元素时的速度会比deque快,这和两者
内部实现有关
函数原型
| deque deq; | 功能 |
|---|---|
| deque deq; | 其中T是泛型,用来存放数据类型,这是默认构造函数,较为常用 |
| deque(deq.begin(), deq.end()); | 将[deq.begin(),deq.end)前闭后开的区间内的元素拷贝给本身容器 |
| deque(n,elem); | 构造函数将n个elem值拷贝给本身容器 |
| deque(const deque &ans); | 拷贝构造函数 |
代码示例
#include<iostream>usingnamespacestd;#include<deque>voidprintDeque(constdeque<int>&d)//只读容器不可改{//迭代器变为 const_iteratorfor(deque<int>::const_iterator it=d.begin();it!=d.end();it++){cout<<*it<<" ";}cout<<endl;}voidtset1(){//默认构造deque<int>d1;for(inti=0;i<10;i++){d1.push_back(i);}printDeque(d1);//区间构造deque<int>d2(d1.begin(),d1.end());printDeque(d2);//赋值构造deque<int>d5(7);printDeque(d5);//赋值构造deque<int>d3(7,5);printDeque(d3);//拷贝构造deque<int>d4(d3);printDeque(d4);}intmain(){test1();system("pause");return0;}赋值
deque& operator=(const deque &ans);重载赋值操作符assign(be,en);将[be,en);将[be,en)区间内的数组拷贝赋值给自己assign(n,elem);将n个elem拷贝赋值给自己
voidtestb(){deque<int>d1;for(inti=0;i<10;i++){d1.push_back(i);}//第一种deque<int>d2=d1;//第二种deque<int>d3;d3.assign(d1.begin(),d1.end());//第三种deque<int>d4;d4.assign(6,88);//测试:printDeque(d2);printDeque(d3);printDeque(d4);}容器大小
对deque的大小进行操作
deque.empty();判断容器是否为空
deque.size();返回容器中元素的个数
deque.resize(m);重新指定容器长度为num,容器变长以默认值填充,容器变短则超出部分删除
deque.resize(m,elem);同上,区别是默认值填充变为elem
注意deque没有容量概念
判断是否为空——empty
返回元素个数——size
重新指定个数——reseize
插入和删除
两端操作:
push_back(e);尾插push_front(e);头插pop_back();尾删pop_front();头删
指定位置:
insert(const_iterator pos,e);迭代器指向位置pos插入指定元素einsert(const_iterator pos,int count ,e);插入count个指定元素einsert(const_iterator pos,beg,en);插入指定区域的元素erase(const_iterator pos);删除迭代器指向的元素erase(const_iterator begin,const_iterator end);删除迭代器从begin到end之间的元素clear();清空容器内所有元素
//两端操作voidtest01(){deque<int>d1;//尾插d1.push_back(10);d1.push_back(20);//头插d1.push_front(100);d1.push_front(200);PrintDeque(d1);//尾删d1.pop_back();PrintDeque(d1);//头删d1.pop_front();PrintDeque(d1);}voidtest02(){deque<int>d2;//尾插d2.push_back(10);d2.push_back(20);//头插d2.push_front(100);d2.push_front(200);PrintDeque(d2);//insert插入d2.insert(d2.begin(),1000);PrintDeque(d2);d2.insert(d2.begin(),2,10000);PrintDeque(d2);//按照区间进行插入deque<int>d3;d3.push_back(1);d3.push_back(2);d3.push_back(3);d2.insert(d2.begin(),d3.begin(),d3.end());PrintDeque(d2);}voidtest03(){deque<int>d4;//尾插d4.push_back(10);d4.push_back(20);//头插d4.push_front(100);d4.push_front(200);PrintDeque(d4);//删除deque<int>::iterator it=d4.begin();it++;d4.erase(it);PrintDeque(d4);//按照区间方式删除d4.erase(d4.begin(),d4.end());PrintDeque(d4);//清空d4.clear();PrintDeque(d4);}数据存取
- 对deque中的元素进行存取操作
函数原型:
at(int dex);返回索引dex所指的数据operator[];同上front();返回容器中第一个数据back();返回容器中最后一个数据//通过[]方式访问元素
for (int i = 0; i < d1.size(); i++)
{
cout << d1[i] << " ";
}
cout << endl;
//通过at方式访问元素
for (int i = 0; i < d1.size(); i++)
{
cout << d1.at(i) << " ";
}
排序
- 需要引入头文件:
<algorithm> - 利用算法实现对deque容器的排序