首页 > 编程知识 正文

容器有哪些,deque原理

时间:2023-05-03 21:09:46 阅读:150742 作者:3108

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;}


总结:

deque没有容量的概念判断是否为空 — empty返回元素个数 — size重新指定个数 — resize 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 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;}


总结:

插入和删除提供的位置是迭代器!尾插 — push_back尾删 — pop_back头插 — push_front头删 — pop_front deque数据存取

函数原型:

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;}


总结:

除了用迭代器获取deque容器中元素,[ ]和at也可以
2.front返回容器第一个元素back返回容器最后一个元素 deque排序

利用算法实现对deque容器进行排序:
sort(iterator beg, iterator end) //对beg和end区间内元素进行排序

#include <deque>#include<iostream>#include<algorithm>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); printDeque(d); sort(d.begin(), d.end()); printDequeInt(d);}int main(){ test01(); return 0;}

案例

有五名选手: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;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。