1、基本概念
功能:雙端數組,可以對頭端進行插入刪除操作
deque與vector區別:
vector對於頭部的插入刪除效率低,數據量越大,效率越低
deque相對而言,對頭部的插入刪除速度比vector快
vector訪問元素時的速度會比deque快,這和兩者內部實現有關
deque容器的迭代器也支持隨機訪問
2、構造函數
默認構造形式
deque<T> deqT
構造函數將[beg,end)區間中的元素拷貝給本身。
deque(beg,end)
構造函數將n個elem拷貝給本身。
deque(n,elem)
拷貝構造函數
deque(const deque& deq)
如果要限制數據是隻讀狀態,那麼迭代器的狀態也要發生改變
#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;
}
void test01()
{
//無參構造,默認構造
deque<int>d1;
for(int i=0;i<10;i++)
{
d1.push_back(i);
}
printDeque(d1);
//第二種
deque<int>d2(d1.begin(),d1.end()) ;
printDeque(d2);
//第三種
deque<int>d3(10,100) ;
printDeque(d3);
//第四種
deque<int>d4(d3);
printDeque(d4);
}
int main()
{
test01();
}
deque和vector容器構造方式幾乎一樣
3、賦值操作
重載等號操作符
vector& operator=(const vector&vec)
將[beg,end)區間中的數據拷貝賦值給本身
assign(beg,end)
將n個elem拷貝賦值給本身
assign(n,elem);
代碼如下
#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;
}
void test01()
{
deque<int>d1;
for(int i=0;i<10;i++)
{
d1.push_back(i);
}
printDeque(d1);
//第一種
deque<int>d2;
d2=d1;
printDeque(d2);
//第二種
deque<int>d3;
d3.assign(d1.begin(),d1.end()) ;
printDeque(d3);
//第三種
deque<int>d4;
d4.assign(10,100);
printDeque(d4);
}
int main()
{
test01();
}
4、容量、大小操作
對deque容器容量和大小判斷
判斷容器是否爲空
empty()
返回容器中元素的個數
size()
重新指定容器的長度爲num
resize(int num)
若容器變長,則以默認值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。
重新指定容器的長度爲num
resize(int num,elem);
若容器變長,則以elem值填充新位置。如果容器變短,則未尾超出容器長度的元素被刪除
deque沒有容量概念,但有大小概念
因爲它是一個雙端數組
代碼如下
#include<iostream>
using namespace std;
#include<deque>
void printDeque(deque<int>&d)
{
for(deque<int>::iterator it=d.begin();it!=d.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
void test01()
{
deque<int>d1;
for(int i=0;i<10;i++)
{
d1.push_back(i);
}
printDeque(d1);
if(d1.empty())
{
cout<<"d1爲空"<<endl;
}
else
{
cout<<"d1不爲空"<<endl;
cout<<"d1的大小爲:"<<d1.size()<<endl;
}
//重新指定大小
d1.resize(15,2);
printDeque(d1);
d1.resize(5);
printDeque(d1);
}
int main()
{
test01();
}
總結:
deque沒有容量的概念
判斷是否爲空------empty
返回元素個數-----------size
重新指定個數------------resize
5、插入和刪除
向deque中插入和刪除數據
函數原型:
在容器尾部添加一個數據
push_back(elem);
在容器頭部插入一個數據
push_front(elem)
刪除容器最後一個數據
pop_back()
刪除容器第一個數據
pop_front()
指定位置操作:
在pos位置插入一個elem元素的拷貝,返回新數據的位置
insert(pos,elem)
在pos位置插入n個elem數據,無返回值。
insert(pos,n,elem)
在pos位置插入[beg.end)區間的數據,無返回值。
insert(pos,beg,end)
清空容器的所有數據
clear()
刪除[beg.end)區間的數據,返回下一個數據的位置。
erase(beg,end)
刪除pos位置的數據,返回下一個數據的位置。
erase(pos)
其中,pos都是迭代器
代碼如下
#include<iostream>
using namespace std;
#include<deque>
void printDeque(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);
//200 100 10 20
printDeque(d);
//尾刪
d.pop_back();
//200 100 10
printDeque(d);
//頭刪
d.pop_front();
//100 10
printDeque(d);
}
void test02()
{
deque<int> d;
d.push_back(10);
d.push_back(20);
d.push_front(100);
d.push_front(200);
//200 100 10 20
printDeque(d);
d.insert(d.begin(),1000);
//1000,200 100 10 20
printDeque(d);
d.insert(d.begin(),2,1000);
//1000,1000,1000,200 100 10 20
printDeque(d);
//指定位置插入區間
deque<int> d2;
d2.push_back(1);
d2.push_back(2);
d2.push_front(10);
d2.push_front(20);
d.insert(d.begin(),d2.begin(),d2.end());
printDeque(d);
}
void test03()
{
deque<int> d;
d.push_back(10);
d.push_back(20);
d.push_front(100);
d.push_front(200);
//200 100 10 20
printDeque(d);
d.erase(d.begin());
//100 10 20
printDeque(d);
//刪除指定項
deque<int>::iterator it=d.begin();
it++;
d.erase(it);
printDeque(d);
//清空
//d.clear();
d.erase(d.begin(),d.end());
printDeque(d);
}
int main()
{
//test01();
//test02();
test03();
}
6、數據存取
返回索引idx所指的數據
at(int idx)
返回索引idx所指的數據
operator[]
返回容器中第一個數據元素
front()
返回容器中最後一個數據元素
back()
代碼如下
#include<iostream>
using namespace std;
#include<deque>
void printDeque(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);
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();
}
7、排序
對beg和end區間內元素進行排序
sort(iterator beg,iterator end)
代碼如下
#include<iostream>
using namespace std;
#include<deque>
#include<algorithm>
void printDeque(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);
cout<<"排序後:"<<endl;
sort(d.begin(),d.end());
printDeque(d);
}
int main()
{
test01();
}
默認sort都是升序排序,也可以添加函數改爲降序排序