deque容器
deque容器的基本概念
功能:
-
双端数组,可以对头端进行插入删除操作
deque容器与vector容器的区别
-
vector对于头部的插入删除效率低,数据量越大,效率越低
-
deque容器相对而言,对头部的插入删除速度比vector快
-
vector容器访问元素时的速度会比deque快,这和两者内部实现有关
头文件
#include<deque>
deque容器的操作(表格)
函数deque<int>a;deque<int>b; | 意义 | 使用 |
---|---|---|
front() | 第一个元素 | 返回容器中第一个数据元素a.front(); |
begin() | 类头指针 | |
back() | 最后一个元素 | 返回容器中最后一个数据元素a.back(); |
end() | 类(尾指针后退一格) | |
a.push_back(elem); | 尾插法插数,尾部插入元素ele | v.push_back(存入数据);当数组//尾插法输出正 |
a.push_front(elem) | 在容器头部插入一个数据 | a.push_front(存入数据)//尾插法是反着的 |
a.pop_back() | 删除容器最后一个数据 | int n; n = num3(); for (int i = 0; i <n; i++) { a.pop_back(); } |
a.pop_front() | 删除容器第一个数据 | for (int i = 0; i < n;i++) { a.pop_front(); } |
a.insert(pos,elem) | 在pos位置插入一个elem元素的拷贝,返回新数据的位置 | for (int i = 0; i < num; i++) { int elem; cout << "输入要插入元素" << endl; cin >> elem; a.insert((a.begin()+i), elem); } |
a.insert(pos,n,elem); | 在pos位置插入n个elem数据,无返回值 | a.insert(a.begin(),插入个数,插入量) |
a.insert(pos,beg,end); | 在pos位置插入[beg,end]区间的数据,无返回值 | a.insert(b.begin(), a.begin(), a.end()); //a的头插入b的全部 |
a.clear(); | 清空容器的所有数据 | a.clear(); |
a.erase(beg,end) | 删除[beg,end]区间的数据,返回下一个数据的位置 | int num3; num3 = nums(); a.erase(a.begin(), (a.begin() + num3)); |
a.erase() | 删除Pos位置的数据,返回下一个数据的位置 | for (num3; num3>0;num3--) { int elem; cout << "输入要插入元素" << endl; cin >> elem; a.erase(a.begin() + num3); } |
a.assign(入容器名.begin(),入容器名.end()) | 将传入容器赋值给调用容器 | b.assign(a.begin(),a.end()); |
a.assign(个数,内容) | 内容个 个数给调用 | vector<int>b;b.assign(10,100); |
a.empty(); | 判断容器是否为空 | if(a.empty()==0) { cout<<"a不为空"<<endl; } else if(a.empty()) { cout<<"容器为空"<<endl; } |
a.size(); | 返回容器中元素的个数 | cout<<"容器存放长度为"<<a.size()<<endl; |
a.resize(num); | 重新指定容器的长度为num,若容器变长,则以默认值0填充新位置(也可自己选填充什么),若容器变短,则末尾超出容器长度的元素被删除 | a.resize(2); |
a.resize(num,elem) | 重新指定容器的长度为num,若容器变长则以elem值填充新位置,若容器变短则末尾超出容器长度的元素被删除 | a.resize(16,2); |
a.at(int idx); | 返回索引idx所指的数据 | int b = a.size(); for (int f = 0; f < b; f++) { cout << a.at(f) << endl; } |
operator[]; | 返回索引idx所指的数据 | int b = a.size(); for (int f = 0; f < b; f++) { cout << a[f] << endl; } |
sort(iterator beg,iterator end) | 对beg和end区间内元素进行排序,默认从小到大(对于支持随机访问的迭代器的容器都可以利用sort算法直接对其进行排序) | 头文件#include<algorithm> sort(a.begin(),a.end());从小到大 |
deque内部工作原理
deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放其真实数据中控制器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间
-
deque容器的迭代器也是支持随机访问的
duque容器的构造函数
功能描述:
-
deque容器构造
-
函数原型
-
deque<T>deqT;//默认构造形式
-
deque(beg,end);//构造函数将[beg,end]区间中的元素拷贝给本身
-
deque(n,elem);//构造函数将n个elem拷贝给本身
-
deque(const deque &deq);//拷贝构造函数
构造函数deque<类型>容器对象名; | 实现 |
---|---|
deque<类型>a;a.push_back(赋入内容); | deque<int>a; int b; cout<<"输入要存入数据的数量"<<endl; cin>>b; for(int i=0;i<b;i++) { int c; cout<<"输入要存入的数字"<<endl; cin>>c; a.push_back(c); } |
deque<类型>b(a.begin(),a.end());把a中存的内容赋值给b | deque<int>b(a.begin(),a.end()); |
deque<类型>容器对象名(赋入内容个数,赋入内容); | deque<int>c(10,100); |
deque<类型>容器对象名(拷贝对象名);容器对象拷贝拷贝对象的内容 | deque<int>d(c); |
#include<iostream>
#include<deque>
using namespace std;
//加const限定只读
void printdeque(const deque<int>&a)
{
for(deque<int>::const_iterator it=a.begin();it!=a.end();it++)
{
cout<<*it<<endl;
}
}
int main()
{
deque<int>a;
int b;
cout<<"输入要存入数据的数量"<<endl;
cin>>b;
for(int i=0;i<b;i++)
{
int c;
cout<<"输入要存入的数字"<<endl;
cin>>c;
a.push_back(c);
}
printdeque(a);
deque<int>b(a.begin(),a.end());
printdeque(b);
deque<int>c(10,100);
printdeque(c);
deque<int>d(c);
printdeque(d);
system("pause");
return 0;
}
deque容器赋值操作
功能描述:
-
给deque容器进行赋值
-
函数原型
-
deque&operator=(const deque &deq);//重载等号操作符
-
assign(beg,end);//将【beg,end】区间中的数据拷贝赋值给本身
-
assign(n,elem);//将n个elem拷贝赋值给本身
#include<iostream>
#include<deque>
using namespace std;
void printdeque(deque<int>&a)
{
for(deque<int>::iterator it=a.begin();it!=a.end();it++)
{
cout<<*it<<endl;
}
}
int main()
{
deque<int>a;
int b;
cout<<"输入要插入的数据量"<<endl;
cin>>b;
for(int i=0;i<b;i++)
{
a.push_back(b);
}//= 的重载
printdeque(a);
deque<int>b;
b=a;
printdeque(b);
deque<int>c;
c.assign(a.begin(),a.end());
printdeque(c);
deque<int>d(10,100);
printdeque(d);
system("pause");
return 0;
}
deque容器大小操作
功能描述:
-
函数原型
-
对deque容器的大小进行操作
-
deque.empty();//判断容器是否为空
-
deque.size();//返回容器中元素的个数
-
deque.resize(num);//重新指定容器的长度为num若容器变长,则以默认值填充新位置 如果容器变短,则末尾超出容器长度的元素被删除
-
deque.resize(num,elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除
#include<iostream>
#include<deque>
using namespace std;
void printdeque(const deque<ing>&a)
{
for(deque<int>::const_iterator it=a.begin();it!=a.end();it++)
{
cout<<*it<<endl;
}
}
int main()
{
deque<int>a;
for(int i=0;i<10;i++)
{
a.push_back(i);
}
if(a.empty()==0)
{
cout<<"a不为空"<<endl;
}
else if(a.empty())
{
cout<<"容器为空"<<endl;
}
printdeque(a);
cout<<"容器存放长度为"<<a.size()<<endl;
a.resize(16,2);
printdeque(a);
a.resize(2);
printdeque(a);
system("pause");
return 0;
}
deque容器插入和删除
功能描述:
-
向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();//清空容器的所有数据
-
erase(beg,end);//删除【beg,end】区间的数据,返回下一个数据的位置
-
erase(pos);//删除pos位置的数据,返回下一个数据的位置
#include<iostream>
#include<deque>
using namespace std;
void addpoint(deque<int>& a);
void deletepoint2(deque<int>& a);
void deletepoint(deque<int>& a);
void printdeque(const deque<int>&a)
{
for (deque<int>::const_iterator it = a.begin(); it != a.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void look(deque<int>&a)
{
int b=a.size();
for(int f=0;f<b;f++)
{
cout<<a.at(f)<<endl;
}
}
void look2(deque<int>&a)
{
int b=a.size();
for(int f=0;f<b;f++)
{
cout<<a[f]<<endl;
}
}
void lookhe(deque<int>&a)
{
cout<<"模板的第一个元素为"<<a.front()<<endl;
cout<<"模板的最后一个元素为"<<a.back()<<endl;
}
//部分用的为了省事
int nums() //确定存入数量
{
int i;
cout << "输入要存入数据的量" << endl;
cin >> i;
return i;
}
int num() //确定存入数据
{
int g;
cout << "输入要存入的数据" << endl;
cin >> g;
return g;
}
int num3()
{
int r;
cout << "输入要删除的数量" << endl;
cin >> r;
return r;
}
//头插法
void headpush(deque<int>&a)
{
int i = nums();
for (int n = 0; n < i; n++)
{
int t;
t = num();
a.push_front(t);
}
}
//尾插法
void endpush(deque<int>&a)
{
int i = nums();
for (int n = 0; n < i; n++)
{
int t;
t = num();
a.push_back(t);
}
}
//头删
void headpop(deque<int>&a)
{
int n;
n = num3();
for (int i = 0; i < n;i++)
{
a.pop_front();
}
}
//尾删
void endpop(deque<int>& a)
{
int n;
n = num3();
for (int i = 0; i <n; i++)
{
a.pop_back();
}
}
int main()
{
//两端操作
deque<int>a;
deque<int>b;
headpush(a);//头插法
printdeque(a);
headpop(a);
printdeque(a);
cout <<"-----------------------------------------------" << endl;
endpush(b);//尾插法
printdeque(b);
endpop(b);
printdeque(b);
//对指定位置进行插入 insert是头插
addpoint(a);
printdeque(a);
cout << endl;
cout << endl;
//对指定位置进行删除
deletepoint(a);
printdeque(a);
deletepoint2(a);
look(a);
lookhe(a);
a.insert(b.begin(), a.begin(), a.end()); //a的头插入b的全部
a.clear();
look2(a);
system("pause");
return 0;
}
//对指定位置进行插入 insert是头插
void addpoint(deque<int>&a)
{
int num;
num = nums();
for (int i = 0; i < num; i++)
{
int elem;
cout << "输入要插入元素" << endl;
cin >> elem;
a.insert((a.begin()+i), elem);
}
}
//对指定位置进行删除
void deletepoint(deque<int>&a)
{
int num3;
num3 = nums();
for (num3; num3>0;num3--)
{
int elem;
cout << "输入要插入元素" << endl;
cin >> elem;
a.erase(a.begin() + num3);
}
}
void deletepoint2(deque<int>&a)
{
int num3;
num3 = nums();
a.erase(a.begin(), (a.begin() + num3));
}
deque容器数据的存取
功能描述:
-
对deque中的数据的存取操作
-
函数原型:
-
at(int dex);//返回索引idx所指的数据
-
operator[ ];//返回索引idx所指的数据
-
front( );//返回容器中第一个数据元素
-
back( );//返回容器中最后一个数据元素
#include<iostream>
#include<deque>
using namespace std;
void addpoint(deque<int>&a);
void deletepoint2(deque<int>&a);
void deletepoint(deque<int>&a);
void printdeque(const deque<int>&a)
{
for (deque<int>::const_iterator it = a.begin(); it != a.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void look(deque<int>&a)
{
int b = a.size();
for (int f = 0; f < b; f++)
{
cout << a.at(f) << endl;
}
}
void look2(deque<int>&a)
{
int b = a.size();
for (int f = 0; f < b; f++)
{
cout << a[f] << endl;
}
}
void lookhe(deque<int>& a)
{
cout << "模板的第一个元素为" << a.front() << endl;
cout << "模板的最后一个元素为" << a.back() << endl;
}
//部分用的为了省事
int nums() //确定存入数量
{
int i;
cout << "输入要存入数据的量" << endl;
cin >> i;
return i;
}
int num() //确定存入数据
{
int g;
cout << "输入要存入的数据" << endl;
cin >> g;
return g;
}
int num3()
{
int r;
cout << "输入要删除的数量" << endl;
cin >> r;
return r;
}
//头插法
void headpush(deque<int>&a)
{
int i = nums();
for (int n = 0; n < i; n++)
{
int t;
t = num();
a.push_front(t);
}
}
//尾插法
void endpush(deque<int>&a)
{
int i = nums();
for (int n = 0; n < i; n++)
{
int t;
t = num();
a.push_back(t);
}
}
//头删
void headpop(deque<int>&a)
{
int n;
n = num3();
for (int i = 0; i < n;i++)
{
a.pop_front();
}
}
//尾删
void endpop(deque<int>& a)
{
int n;
n = num3();
for (int i = 0; i <n; i++)
{
a.pop_back();
}
}
int main()
{
//两端操作
deque<int>a;
deque<int>b;
headpush(a);//头插法
printdeque(a);
headpop(a);
printdeque(a);
cout <<"-----------------------------------------------" << endl;
endpush(b);//尾插法
printdeque(b);
endpop(b);
look2(b);
//对指定位置进行插入 insert是头插
addpoint(a);
printdeque(a);
cout << endl;
cout << endl;
//对指定位置进行删除
deletepoint(a);
printdeque(a);
deletepoint2(a);
look(a);
lookhe(a);
a.insert(b.begin(), a.begin(), a.end()); //a的头插入b的全部
a.clear();
printdeque(a);
system("pause");
return 0;
}
//对指定位置进行插入 insert是头插
void addpoint(deque<int>&a)
{
int num;
num = nums();
for (int i = 0; i < num; i++)
{
int elem;
cout << "输入要插入元素" << endl;
cin >> elem;
a.insert((a.begin()+i), elem);
}
}
//对指定位置进行删除
void deletepoint(deque<int>&a)
{
int num3;
num3 = nums();
for (num3; num3>0;num3--)
{
int elem;
cout << "输入要插入元素" << endl;
cin >> elem;
a.erase(a.begin() + num3);
}
}
void deletepoint2(deque<int>&a)
{
int num3;
num3 = nums();
a.erase(a.begin(), (a.begin() + num3));
}
deque排序
功能描述:
-
利用算法实现deque容器进行排序
-
算法:
-
sort(iterator beg ,iterator end);//对beg与end区间内元素进行排序