deque容器介绍了deque容器的结构和赋值deque大小操作deque插入和删除deque数据访问deque排序方案
介绍deque模板类用于deque头文件中,表示双端队列,通常称为deque。 在STL中,实现了一个类似于vector的容器以支持随机访问。 不同之处在于,从deque对象的开始位置插入和删除元素的时间是固定的,而不是像vector一样的线性时间。 如果操作发生在序列的开头和结尾,则应考虑使用deque数据结构。 deque对象的设计比vector更复杂,插入和删除操作中vector容器的速度更快。 deque容器没有容量概念,它由分段连续的空间组成。
deque与vector区别:
对于向头部插入删除的效率较低、数据量越大效率越低的deque,向头部插入删除的速度比vector快,vector访问要素时的速度比deque快,这与两者的内部实现有关
deque内部有一个中央控制台,用于维护每个缓冲区的内容,并将实际数据存储在缓冲区中
2 .中央控制台维护每个缓冲区的地址,就像使用deque时连续的内存空间一样
deque容器的结构和赋值deque内部工作原理:
deque deqT; //默认结构格式deque(beg,end ); //构造函数将[beg,end区间的元素复制到自身的deque(n,elem ); //构造函数将n个elem复制到自身。 eque (常量请求); //复印构造函数deque构造函数原型:
assign(Beg,end ); [复制beg,end区间的数据并分配给自己。 dequeoperator=(constdequedeq; //等号运算符swap重载(deq ); //deq与自身元素互换; assign(n,elem );//向自己分配n个elem副本。 # include iostream # includedequeusingnamespacestd; voidprintdequeint(dequeintd ) for ) deque int :3360 iterator it=d.begin ); 信息技术!=d.end (; it}{cout*it '; } coutendl; }void test01 () dequeintd ) ) 5、10 ); printdequeint(d; //1010101010//assign(n,elem );//向自己分配n个elem副本。 dequeint d1; D1.assign (5,100 ); printdequeint(D1; //100100100100100//deque operator=(constdequedeq )//重载等号运算符dequeint d2; d2=d1; printdequeint(D2 ); //100 100 100 100 100 //swap(deq )//deq与自身元素互换的dequeintd3(5,1 ); dequeintd4(5,2; printdequeint(D3; //11111打印请求(D4 ); //2222D3.swap(D4; printdequeint(D3; //2222打印请求(D4 ); //11111 ) intmain () { test01; 返回0; }
deque大小操作函数原型:
deque.empty (; //判断容器是否为空
2.deque.size (; //返回容器中元素的数量deque.resize(num )//将容器的长度重新指定为num,当容器变长时用默认值填充新位置。 //容器变短时,末尾会删除超过容器长度的要素。 dque.resize(num,elem ); //将容器的长度重新指定为num,当容器变长时用elem值填充新位置。
//容器变短时,末尾会删除超过容器长度的要素。 # include iostream # includedequeusingnamespacestd; voidprintdequeint(dequeintd ) for ) deque int :3360 iterator it=d.begin ); 信息技术!=d.end (; I
t++) { cout<<*it<<" "; } cout<<endl; }void test01(){ deque<int> d1; for(int i=0;i<10;i++) { d1.push_back(i); } printDequeInt(d1); //判断容器是否为空 if(d1.empty()) { cout<<"d1为空"<<endl; } else { cout<<"d1不为空"<<endl; //统计大小 cout<<"d1的大小为:"<<d1.size()<<endl; } //从新指定大小 d1.resize(15,1); printDequeInt(d1); d1.resize(5); printDequeInt(d1);}int main(){ test01(); return 0;}
总结:
函数原型:
两端插入:
指定位置操作:
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 printDequeInt(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); printDequeInt(d); //尾删 d.pop_back(); //头删 d.pop_front(); printDequeInt(d);}//插入void test02(){ deque<int> d; d.push_back(10); d.push_back(20); d.push_front(100); d.push_front(200); printDequeInt(d); d.insert(d.begin(),2,10000); printDequeInt(d); deque<int>d2; d.push_back(1); d.push_back(2); d.push_back(3); d.insert(d.begin(),d2.begin(),d2.end()); printDequeInt(d);}//删除void test03(){ deque<int> d; d.push_back(10); d.push_back(20); d.push_front(100); d.push_front(200); printDequeInt(d); d.erase(d.begin()); printDequeInt(d); d.erase(d.begin(),d.end()); d.clear(); printDequeInt(d);}int main(){ //test01(); //test02(); test03(); return 0;}
总结:
函数原型:
at(int idx); //返回索引idx所指的数据operator[]; //返回索引idx所指的数据front(); //返回容器中第一个数据元素back(); //返回容器中最后一个数据元素 #include <iostream>#include<deque>using namespace std;void printDequeInt(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); 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<<"front:"<<d.front()<<endl; cout<<"back:"<<d.back()<<endl;}int main(){ test01(); return 0;}
总结:
2.front返回容器第一个元素back返回容器最后一个元素 deque排序
利用算法实现对deque容器进行排序:
sort(iterator beg, iterator end) //对beg和end区间内元素进行排序
有五名选手:ABCDE;10个评委分别对每一个选手打分,去除最高分,去除评委中最低分,取平均分,最后输出每位选手的分数。
步骤:
创建五名选手,放到vector中遍历vector容器,取出来每一个选手,执行for循环,可以把10个评分打分存到deque容 器中sort算法对deque容器中分数排序,pop_back pop_front去除最高和最低分deque容器遍历一遍,累加分数,累加分数/d.size()person.score = 平均分 #include<iostream>#include<string>#include<vector>#include<deque>#include<stdlib.h>#include<time.h>#include<algorithm>using namespace std;//选手class Person{public: string name; int score; Person(string name,int score) { this->name=name; this->score=score; }};void creatPerson(vector<Person> &v){ //5名选手ABCDE string nameTmp="ABCDE"; for(int i=0;i<5;i++) { string name="选手:"; name+=nameTmp[i]; //将选手的姓名 分数放入vector容器中 v.push_back(Person(name,0)); }}void printVectorPerson(vector<Person> &v){ for(vector<Person>::iterator it=v.begin();it!=v.end();it++) { //*it==Person cout<<(*it).name<<" "<<(*it).score<<endl; }}void playGame(vector<Person> &v){ //设置随机种子 srand(time(NULL)); //容器v中的每个人 逐一比赛 for(vector<Person>::iterator it=v.begin();it!=v.end();it++) { //*it==Person //每位选手 都要被10个评委打分 放入deque容器中 deque<int> d; for(int i=0;i<10;i++) { int score=rand()%41+60;//60~100 d.push_back(score); } //对deque容器 (评委的10个分数)排序 sort(d.begin(),d.end());//取掉一个最低分 最高分 //取掉一个最低分 d.pop_front(); //取掉一个最高分 d.pop_back(); //得到每个选手的总分 int sum=accumulate(d.begin(),d.end(),0); //获取平均分 赋值 选手的成绩 (*it).score=sum/d.size(); }}int main(){ //1.定义个vector容器放五位选手 vector<Person> v; creatPerson(v); //2.5名选手逐一比赛 playGame(v); //3.将5名选手的成绩打印出来 printVectorPerson(v); return 0;}