1、基本概念
功能:双端数组,可以对头端进行插入删除操作
deque与vector区别:
vector对于头部的插入删除效率低,数据量越大,效率越低
deque相对而言,对头部的插入删除速度比vector快
vector访问元素时的速度会比deque快,这和两者内部实现有关
deque容器的迭代器也支持随机访问
2、构造函数
默认构造形式
deque<T> deqT
构造函数将[beg,end)区间中的元素拷贝给本身。
deque(beg,end)
构造函数将n个elem拷贝给本身。
deque(n,elem)
拷贝构造函数
deque(const deque& deq)
如果要限制数据是只读状态,那么迭代器的状态也要发生改变
#include<iostream>
using namespace std;
#include<deque>
void printDeque(const deque<int>&d)
{
for(deque<int>::const_iterator it=d.begin();it!=d.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
void test01()
{
//无参构造,默认构造
deque<int>d1;
for(int i=0;i<10;i++)
{
d1.push_back(i);
}
printDeque(d1);
//第二种
deque<int>d2(d1.begin(),d1.end()) ;
printDeque(d2);
//第三种
deque<int>d3(10,100) ;
printDeque(d3);
//第四种
deque<int>d4(d3);
printDeque(d4);
}
int main()
{
test01();
}
deque和vector容器构造方式几乎一样
3、赋值操作
重载等号操作符
vector& operator=(const vector&vec)
将[beg,end)区间中的数据拷贝赋值给本身
assign(beg,end)
将n个elem拷贝赋值给本身
assign(n,elem);
代码如下
#include<iostream>
using namespace std;
#include<deque>
void printDeque(const deque<int>&d)
{
for(deque<int>::const_iterator it=d.begin();it!=d.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
void test01()
{
deque<int>d1;
for(int i=0;i<10;i++)
{
d1.push_back(i);
}
printDeque(d1);
//第一种
deque<int>d2;
d2=d1;
printDeque(d2);
//第二种
deque<int>d3;
d3.assign(d1.begin(),d1.end()) ;
printDeque(d3);
//第三种
deque<int>d4;
d4.assign(10,100);
printDeque(d4);
}
int main()
{
test01();
}
4、容量、大小操作
对deque容器容量和大小判断
判断容器是否为空
empty()
返回容器中元素的个数
size()
重新指定容器的长度为num
resize(int num)
若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
重新指定容器的长度为num
resize(int num,elem);
若容器变长,则以elem值填充新位置。如果容器变短,则未尾超出容器长度的元素被删除
deque没有容量概念,但有大小概念
因为它是一个双端数组
代码如下
#include<iostream>
using namespace std;
#include<deque>
void printDeque(deque<int>&d)
{
for(deque<int>::iterator it=d.begin();it!=d.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
void test01()
{
deque<int>d1;
for(int i=0;i<10;i++)
{
d1.push_back(i);
}
printDeque(d1);
if(d1.empty())
{
cout<<"d1为空"<<endl;
}
else
{
cout<<"d1不为空"<<endl;
cout<<"d1的大小为:"<<d1.size()<<endl;
}
//重新指定大小
d1.resize(15,2);
printDeque(d1);
d1.resize(5);
printDeque(d1);
}
int main()
{
test01();
}
总结:
deque没有容量的概念
判断是否为空------empty
返回元素个数-----------size
重新指定个数------------resize
5、插入和删除
向deque中插入和删除数据
函数原型:
在容器尾部添加一个数据
push_back(elem);
在容器头部插入一个数据
push_front(elem)
删除容器最后一个数据
pop_back()
删除容器第一个数据
pop_front()
指定位置操作:
在pos位置插入一个elem元素的拷贝,返回新数据的位置
insert(pos,elem)
在pos位置插入n个elem数据,无返回值。
insert(pos,n,elem)
在pos位置插入[beg.end)区间的数据,无返回值。
insert(pos,beg,end)
清空容器的所有数据
clear()
删除[beg.end)区间的数据,返回下一个数据的位置。
erase(beg,end)
删除pos位置的数据,返回下一个数据的位置。
erase(pos)
其中,pos都是迭代器
代码如下
#include<iostream>
using namespace std;
#include<deque>
void printDeque(deque<int>&d)
{
for(deque<int>::iterator it=d.begin();it!=d.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
//两端操作
void test01()
{
deque<int> d;
//尾插
d.push_back(10);
d.push_back(20);
//头插
d.push_front(100);
d.push_front(200);
//200 100 10 20
printDeque(d);
//尾删
d.pop_back();
//200 100 10
printDeque(d);
//头删
d.pop_front();
//100 10
printDeque(d);
}
void test02()
{
deque<int> d;
d.push_back(10);
d.push_back(20);
d.push_front(100);
d.push_front(200);
//200 100 10 20
printDeque(d);
d.insert(d.begin(),1000);
//1000,200 100 10 20
printDeque(d);
d.insert(d.begin(),2,1000);
//1000,1000,1000,200 100 10 20
printDeque(d);
//指定位置插入区间
deque<int> d2;
d2.push_back(1);
d2.push_back(2);
d2.push_front(10);
d2.push_front(20);
d.insert(d.begin(),d2.begin(),d2.end());
printDeque(d);
}
void test03()
{
deque<int> d;
d.push_back(10);
d.push_back(20);
d.push_front(100);
d.push_front(200);
//200 100 10 20
printDeque(d);
d.erase(d.begin());
//100 10 20
printDeque(d);
//删除指定项
deque<int>::iterator it=d.begin();
it++;
d.erase(it);
printDeque(d);
//清空
//d.clear();
d.erase(d.begin(),d.end());
printDeque(d);
}
int main()
{
//test01();
//test02();
test03();
}
6、数据存取
返回索引idx所指的数据
at(int idx)
返回索引idx所指的数据
operator[]
返回容器中第一个数据元素
front()
返回容器中最后一个数据元素
back()
代码如下
#include<iostream>
using namespace std;
#include<deque>
void printDeque(deque<int>&d)
{
for(deque<int>::iterator it=d.begin();it!=d.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
//两端操作
void test01()
{
deque<int> d;
d.push_back(10);
d.push_back(20);
d.push_front(100);
d.push_front(200);
printDeque(d);
for(int i=0;i<d.size();i++)
{
cout<<d[i]<<" ";
}
cout<<endl;
for(int i=0;i<d.size();i++)
{
cout<<d.at(i)<<" ";
}
cout<<endl;
cout<<"第一个元素为:"<<d.front()<<endl;
cout<<"最后一个元素为:"<<d.back()<<endl;
}
int main()
{
test01();
}
7、排序
对beg和end区间内元素进行排序
sort(iterator beg,iterator end)
代码如下
#include<iostream>
using namespace std;
#include<deque>
#include<algorithm>
void printDeque(deque<int>&d)
{
for(deque<int>::iterator it=d.begin();it!=d.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
//两端操作
void test01()
{
deque<int> d;
d.push_back(10);
d.push_back(20);
d.push_front(100);
d.push_front(200);
printDeque(d);
cout<<"排序后:"<<endl;
sort(d.begin(),d.end());
printDeque(d);
}
int main()
{
test01();
}
默认sort都是升序排序,也可以添加函数改为降序排序