deque容器基本概念
功能:雙端數組,可以對頭端進行插入和刪除操作
deque與vector區別:
- vector對于頭部的插入刪除掉率低,數據量越大,效率越低
- deque相對而言,對頭部的插入刪除速度會比vector快
- vetcor訪問元素時的速度會比deque快,這和兩者內部的實現有關
deque工作原理:?
deque容器內部有一個中控器,維護每段緩沖區中的內容,緩沖區中存放真實數據
中控器維護的是每個緩沖區的地址,使得使用deque時像一片連續的區域
- deque容器中的迭代器也是支持隨機訪問的。
deque構造函數?
功能描述
- deque容器構造
函數原型:
deque<T> deqT; //默認構造形式deque(beg,end);//構造函數將【beg,end)區間中的元素拷貝給本身deque(n,ele); //構造函數將n個elem拷貝給本身deque(const deque &deq); //拷貝構造函數
#include <iostream>
using namespace std;
#include <deque>//一般的話會在deque前面加上一個const表明我這個容器只能夠讀,不能夠進行修改
void printDeque(const deque<int> &d)
{for(deque<int>::const_iterator it=d.begin();it!=d.end();it++){cout<<*it<<" ";}cout<<endl;
}//deque構造函數
void test01()
{deque<int> d1;//默認構造函數for(int i=0;i<10;i++){d1.push_back(i); //向隊列尾部添加元素d1.push_front(i+10);//向隊列頭部插入元素}printDeque(d1);deque<int> d2(d1.begin(),d1.end());//區間構造函數printDeque(d2);deque<int> d3(10,100);printDeque(d3);deque<int> d4(d2);//拷貝構造函數printDeque(d4);
}int main()
{test01(); //測試deque的構造函數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(const deque<int> &d)
{for(deque<int>::const_iterator it=d.begin();it!=d.end();it++){cout<<*it<<" ";}cout<<endl;
}//deque容器的賦值操作
void test01()
{deque<int> d1;for(int i=0;i<10;i++){d1.push_back(i);}printDeque(d1);//operator=賦值deque<int> d2;d2=d1;printDeque(d2);//assign賦值deque<int> d3;d3.assign(d1.begin(),d1.end());printDeque(d3);deque<int> d4;d4.assign(10,100);printDeque(d4);}int main()
{test01();return 0;}
因此deque賦值操作跟vector相同,需熟練掌握。
deque容器大小操作
功能描述:對deque容器的大小進行操作
函數原型
deque.empty(); //判斷容器是否為空deque.size(); //返回容器中元素的個數deque.resize(num); //重新指定容器的長度為num,若容器變長,則以默認值填充新位置;若容器變短,則 末尾超出容器長度的元素被刪除deque.resize(num,elem); //重新指定容器的長度為num,若容器變長,則利用elem值填充新位置;若容器變短,則末尾超出容器長度的元素被刪除
在deque容器中是沒有容量的限制的,它可以在后面無限制的擴充新的容量區域。
#include <iostream>
using namespace std;
#include <deque>//對里面的元素進行打印輸出
void printDeque(const deque<int> &d)
{for(deque<int>::const_iterator it=d.begin();it!=d.end();it++){cout<<*it<<" ";}cout<<endl;
}//deque容器的一個大小操作
void test01()
{deque<int> d1;for(int i=0;i<10;i++){d1.push_back(i);}printDeque(d1);if(d1.empty()){cout<<"d1 is empty"<<endl;}else{cout<<"di is not empty"<<endl;cout<<"d1 size: "<<d1.size()<<endl; //deque容器沒有容量概念,因此其數據可以無限的往里面去放,這跟其內部的結構有關系}//重新制定其大小//d1.resize(15);//printDeque(d1);//假如不想用0來填充d1.resize(15,1);printDeque(d1);d1.resize(5);printDeque(d1);}int main()
{test01();}
?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>
using namespace std;
#include <deque>void print_Deque(const deque<int> &d)
{for(deque<int>::const_iterator it=d.begin();it!=d.end();it++){cout << *it << " ";}cout<<endl;}
//deque容器的插入和刪除
void test01()
{//對于兩端進行操作deque<int> d1;d1.push_back(10);//往尾部插入元素d1.push_back(20);//頭插d1.push_front(100);//往頭部插入元素d1.push_front(200);print_Deque(d1);//尾刪d1.pop_back();d1.pop_front();print_Deque(d1);}//對于指定的位置進行一個插入和刪除
void test02()
{deque<int> d2;d2.push_back(10);d2.push_back(20);d2.push_front(100);d2.push_front(200);print_Deque(d2);//利用insert方式來進行插入d2.insert(d2.begin(),1000);print_Deque(d2);d2.insert(d2.begin(),2,10000);print_Deque(d2);//按照區間來進行插入deque<int> d3;d3.push_back(1);d3.push_back(2);d3.push_back(3);d2.insert(d2.begin(),d3.begin(),d3.end());print_Deque(d2);
}//刪除
void test03()
{deque<int> d4;d4.push_back(10);d4.push_back(20);d4.push_front(100);d4.push_front(200);print_Deque(d4);// d4.erase(d4.begin());// print_Deque(d4);//或者是說刪除其他位置的元素deque<int>::iterator it=d4.begin();it++;d4.erase(it);print_Deque(d4);//按照區間的方式刪除d4.erase(d4.begin(),d4.end());print_Deque(d4);//還有一個成員函數是專門用來清空的d4.clear();print_Deque(d4);}int main()
{test03();}
插入刪除提供的位置是迭代器。
deque數據存取操作
功能描述:對deque中的數據存取操作
函數原型
at(int idx); //返回索引值idx所指的數據operator[];//返回索引idx所指的數據front();//返回容器中第一個數據元素back();//返回容器中最后一個數據元素
#include <iostream>
using namespace std;
//deque容器的數據存取操作
#include <deque>void test01()
{deque<int> d;d.push_back(10);d.push_back(20);d.push_back(30);d.push_front(100);d.push_front(200);d.push_front(300);//此時我們不用迭代器了,而是利用[]方式訪問元素//300,200,100,10,20,30for(int i=0;i<d.size();i++){cout<<d[i]<<" ";}cout<<endl;//通過at的方式來訪問元素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();}
deque排序
功能描述:利用算法實現對deque容器進行排序
算法:
sort(iterator beg,iterator end)//對beg和end區間內元素進行排序
#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;void print_Deque(const deque<int> &d)
{for(deque<int>::const_iterator it=d.begin();it!=d.end();it++){cout<<*it<<" ";}cout<<endl;
}//deque容器排序
void test01()
{deque<int> d;d.push_back(10);d.push_back(20);d.push_back(30);d.push_front(100);d.push_front(200);d.push_front(300);print_Deque(d);//排序操作//對于支持隨機訪問的迭代器的容器,都可以利用sort算法來進行排序//vector容器也可以利用sort算法來進行排序sort(d.begin(),d.end());cout<<"排序后的結果:"<<endl;print_Deque(d);
}int main()
{test01();}
案例-評委打分
有五名選手:選手ABCDE,10個評委分別對每一名選手進行打分,去除最高分,去除評為中最低分,取平均分。
實現步驟:
- 創建五名選手,放到vector中
- 遍歷vector容器,取出每一個選手,執行for循環,可以吧10個評分打分存到deque容器中(因為deque容器對于頭端和尾端的操作比較方便)
- sort算法對deque容器中分數排序,取出最高和最低分
- deque容器遍歷一遍,累計總分
- 獲取平均分
#include <iostream>
using namespace std;
#include <vector>
#include <deque>
#include <algorithm>
#include <string>//選手類
class Person{public:Person(string name,int score){this->m_Name=name;this->m_Score=score;}string m_Name;//姓名int m_Score;//分數};void creatPerson(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);//將創建的Person對象放入到容器中v.push_back(p);}
}void setScore(vector<Person> &v)
{for(vector<Person>::iterator it=v.begin();it!=v.end();it++){//將評委的分數放入到deque容器中deque<int> d;for(int i=0;i<10;i++){int score=rand()%41+60; //60~100d.push_back(score);}//輸出每一個評委給他打的分數// cout<<it->m_Name<<"打分: "<<endl;// for(deque<int>::iterator dit=d.begin();dit!=d.end();dit++)// {// cout<<*(dit)<<" ";// }// cout<<endl;//排序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 average_Score=sum/d.size();//將平均分賦值給選手it->m_Score=average_Score;}
}
void showScore(vector<Person> &v)
{for(vector<Person>::iterator pit=v.begin();pit!=v.end();pit++){cout<<"姓名: "<<pit->m_Name<<" 平均分:"<<pit->m_Score<<endl;}
}int main()
{//1.創建5名選手vector<Person> v;//存放選手的容器creatPerson(v);//測試// for(vector<Person>::iterator it=v.begin();it!=v.end();it++)// {// cout<<"姓名:"<<(*it).m_Name<<" 分數:"<<(*it).m_Score<<" ";// }//2.給5名選手打分setScore(v);//3.顯示最后的得分showScore(v);}