deque容器 Posted on 2022-12-08 00:00:00 2022-12-08 21:44:12 by Author 摘要 c++ 学习笔记,deque容器的学习笔记 #### deque容器 功能: - 双端数组,可以对头端进行插入删除操作 - deque和vector的区别 - vector对于头部的插入删除效率低,数据量越大,效率越低 - deque对于头部的插入删除速度比vector快 - vector访问元素时速度比deque快,这和内部实现有关 deque内部工作原理: - deque内部有个中控器,维护每段缓冲中的内容,缓冲区中存放真实数据 - 中控器维护每个缓冲区的地址,使得deque像一片连续的存储空间 - deque容器的迭代器是支持随机访问的 ##### deque构造函数 函数原型: - deque<T> deq; //默认构造函数 - deque(beg,end);//构造函数将(beg,end)区间的元素拷贝到本身 - deque(n,elem);.构造函数将n个elem元素拷贝给本身 - deuqe(const deque &deq)//拷贝构造函数 - ```c++ #include<iostream> using namespace std; #include<deque> #include<string> void printDeque(deque<int>&d){ for(deque<int>::const_iterator it=d.begin();it!=d.end();it++){ cout<<(*it)<<endl; } } void test01(){ deque<int>d; for(int i=1;i<9;i++){ d.push_back(i); } printDeque(d); deque<int>d2(d.begin(),d.end()); printDeque(d2); deque<int>d3(d2); printDeque(d3); deque<int>d4(10,100); printDeque(d4); } int main(){ test01(); return 0; } ``` ##### deque赋值操作 ```c++ #include<iostream> using namespace std; #include<deque> #include<string> 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>d; for(int i=1;i<9;i++){ d.push_back(i); } printDeque(d); deque<int> d2; //operator= d2 = d; printDeque(d2); //assign赋值操作 deque<int> d3; d3.assign(d.begin(),d.end()); printDeque(d3); //n 个elmement deque<int> d4; d4.assign(10,1000); printDeque(d4); } int main(){ test01(); return 0; } ``` - 总结:deque赋值操作和vector操作相同,deque大小操作和vector相似,但是没有容量(capacity)的属性 #### deque插入和删除 函数原型: - push_back(elem); - push_front(elem); - pop_back(); - pop_front(); - 指定位置操作: - insert(pos,elem); - insert(pos,n,elem); - insert(pos,begin,end); - clear(); - erase(beg,end); - erase(pos); - ```c++ #include<iostream> using namespace std; #include<deque> #include<string> 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>d; for(int i=1;i<9;i++){ d.push_back(i); } printDeque(d); d.push_back(10); d.push_front(100); printDeque(d); d.pop_back(); d.pop_front(); printDeque(d); //insert插入 d.insert(d.begin(),1000); printDeque(d); //insert插入 n个elem d.insert(d.begin(),2,900); printDeque(d); //区间插入 d.insert(d.begin(),d.begin(),d.end()); printDeque(d); //删除操作 d.erase(d.begin()); printDeque(d); //删除第二个位置的 deque<int>::iterator it= d.begin(); it++; d.erase(it); printDeque(d); cout<<"-----------"<<endl; d.clear(); printDeque(d); } int main(){ test01(); return 0; } ``` - 插入和删除提供的位置是迭代器 #### deque数据存取的操作 函数原型: - at(int idx); - operator[]; - ftonr(); - back(); - ```c++ #include<iostream> using namespace std; #include<deque> #include<string> 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>d; for(int i=1;i<9;i++){ d.push_back(i); } 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(); return 0; } ``` ##### deque排序 - sort(iterator beg,iterator end); - sort要加头文件#include<algorithm> - ```c++ #include<iostream> using namespace std; #include<deque> #include<string> #include<algorithm> 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>d; for(int i=1;i<9;i++){ d.push_back(i); } printDeque(d); d.push_back(0); d.push_back(1000); d.push_back(33); d.push_front(23342); sort(d.begin(),d.end()); printDeque(d); } int main(){ test01(); return 0; } ``` ### 案例--评委打分 ```c++ #include<iostream> #include<deque> #include<vector> #include<string> #include<algorithm> #include<ctime> using namespace std; class Person{ public: string m_name; int m_score; Person(string name,int score){ this->m_name= name; this->m_score= score; } }; void createPerson(vector<Person>&v){ string nameSeed="ABCDE"; for(int i=0;i<5;i++){ string name="选手"; name+=nameSeed[i]; int score = 0; Person p(name,score); v.push_back(p); } } void setScore(vector<Person>&v){ srand((unsigned int)time(NULL)); for(vector<Person>::iterator it=v.begin();it!=v.end();it++){ deque<int> d; for(int i=0;i<10;i++){ int score = rand()%41 +60; d.push_back(score); } sort(d.begin(),d.end()); //去除最高和最低分 d.pop_back(); d.pop_front(); //取平均分 int sum = 0; for(deque<int>::iterator dit=d.begin();dit!=d.end();dit++){ sum +=(*dit); } int avg = sum/d.size(); it->m_score= avg; } } void printVector(const vector<Person>&d){ for(vector<Person>::const_iterator it=d.begin();it!=d.end();it++){ cout<<"姓名:"<<(*it).m_name<<" 分数:"<<(*it).m_score<<endl; } } void test01(){ vector<Person> v; createPerson(v); printVector(v); setScore(v); printVector(v); } int main(){ test01(); return 0; } ```
{{ item.content }}
{{ child.content }}