您的位置:首页 > 产品设计 > UI/UE

deque的用法及其与vector、list应用比较

2014-09-08 12:18 357 查看
deque(双端队列)快速的访问随机的元素,快速的在开始和末尾插入元素。随机的插入删除元素较慢,空间的从新分配空间后,原有的元素不需要备份。对deque的排序操作,可将deque先复制到vector,排序后再复制回deque。

应用比较:(1)采用deque:对数据有复杂操作,即需要前后增删数据的能力,又要良好的数据访问速度,集
vector和list的优点于一体。

(2)采用list:擅长插入删除的链表,侧重于中间增加删除数据的速度。

(3)采用vector:保存不定长数组,需要动态增加的能力,侧重于寻找数据的速度。

下面就以程序运行的方式展示deque的基本操作,包括容器构造首尾部插入与弹出元素用at或迭代器访问元素指定位置插入一个或多个元素其他deque元素插入现有的deque中逆序输出其他元素置换deque以及其他deque置换现有deque。

#include<iostream>//deque用法
# include<deque>
using namespace std;
int main()
{
//四种初始化方法
deque<int>d;//创建空deque
deque<int>d1(2,5);//创建有两个元素5的deque
deque<int>d2(10,1);//创建一个拥有10个元素1的deque
deque<int>d3(d2);//复制构造函数

//向尾部插入元素
d.push_back(10);
d.push_back(20);
d.push_back(30);
d.push_back(40);
d.push_back(50);

//at(n)取第n个元素,也可以用迭代器的方式取deque元素
cout<<"push_back之后……"<<endl;
for(int i=0;i<d.size();i++)
cout<<d.at(i)<<"\t";
cout<<endl;

//双向队列首部插入元素
d.push_front(5);
d.push_front(4);
d.push_front(3);
d.push_front(2);
d.push_front(1);
cout<<"push_front之后"<<endl;
for(int i=0;i<d.size();i++)
cout<<d.at(i)<<"\t";

//双向队列首部弹出元素
d.pop_front();
d.pop_front();
d.pop_front();
cout<<"pop_front之后"<<endl;
for(int i=0;i<d.size();i++)
cout<<d.at(i)<<"\t";
cout<<endl;

//双向队列尾部弹出元素
d.pop_back();
d.pop_back();
cout<<"pop_back之后"<<endl;
for(int i=0;i<d.size();i++)
cout<<d.at(i)<<"\t";
cout<<endl;

//指定位置插入元素
deque<int>::iterator it;
d.insert(d.begin(),1);
it=d.begin();
cout<<*it<<endl;//it如果在插入之前赋值,则输出会出现错误
cout<<"在某一个位置insert一个元素之后"<<endl;
for(int i=0;i<d.size();i++)
cout<<d.at(i)<<"\t";
cout<<endl;

//指定位置插入多个元素
d.insert(d.begin()+3,3,100);
cout<<"在某一个位置insert多个元素之后"<<endl;
for(int i=0;i<d.size();i++)
cout<<d.at(i)<<"\t";
cout<<endl;

//用其他deque元素插入到现有deque中
cout<<"d2的元素:"<<endl;
for(int i=0;i<d2.size();i++)
cout<<d2.at(i)<<"\t";
cout<<endl;
d.insert(d.begin(),d2.begin(),d2.end());
cout<<"在某一个位置insert同类deque元素之后"<<endl;
for(int i=0;i<d.size();i++)
cout<<d.at(i)<<"\t";
cout<<endl;

//首尾元素输出
cout<<"front and back:"<<endl;
cout<<d.front()<<endl;
cout<<d.back()<<endl;
cout<<"在某一个位置front.back之后"<<endl;
for(int i=0;i<d.size();i++)
cout<<d.at(i)<<"\t";
cout<<endl;

//逆序输出
deque<int>::reverse_iterator end=d.rbegin();
cout<<"从尾部开始输出"<<endl;
for(;end!=d.rend();end++)
cout<<*end<<"\t";
cout<<endl;

//用n个元素置换deque
d.assign(3,99);
cout<<"用n个元素置换原来的deque之后"<<endl;
for(int i=0;i<d.size();i++)
cout<<d.at(i)<<"\t";
cout<<endl;

//用另一个deque置换现有deque
d.assign(d1.begin(),d1.end());
cout<<"另一个deque替换"<<endl;
for(int i=0;i<d.size();i++)
cout<<d.at(i)<<"\t";
cout<<endl;

return 0;
}
运行结果演示:



还是一样,希望能够将程序运行结果和程序的代码一一比对查看,这样效果明显,记忆深刻。后续将补上stack和queue容器的基本用法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: