deque双端队列容器
deque采用分块的星星存储结构来存储数据,每块的大小一般为512个字节,称为一个deque块,所有的deque块使用一个map块进行管理,每个map数据项纪录各块的首地址。
deque块在头部和尾部都可以插入和删除元素,而不需要移动其他元素(使用push_back()方法在尾部插入元素,会扩张队列;而使用push_back()方法在手部插入元素和使用insert()方法在中间插入元素)。
一般来说,当考虑到容器元素的内存分配策略和操作的性能时,deque相对于vector更具有优势。
使用deuqe需要声明头文件包含“#include<deque>”。
创建deque对象
创建deque对象的方法通常有三种,建立对象的时候可以选择不带参数,带一个参数,两个参数。
(1)创建没有任何元素的deque对象
deque<int> d; deque<float> dd;
(2)创建具有n个元素的deque对象
deque<int> d(10); //创建具有10个整形元素的deque对象d
(3)创建具有n个元素的deque对象,并赋初值
deque<float> d(10,2.5); //创建1具有10个初值为2.5的float型的deque对象d
插入元素
(1)使用push_back()方法从尾部插入元素,会不断扩张队列。
#include<deque> #include<iostream> using namespace std; int main() { deque<int> d; d.push_back(1); d.push_back(2); d.push_back(3); cout<<d[0]<<" "<<d[1]<<" "<<d[2]<<endl; return 0; }程序输出 1 2 3
(2)使用push_front()方法从头部插入元素,其他元素向后移动
#include<deque> #include<iostream> using namespace std; int main() { deque<int> d; d.push_back(1); d.push_back(2); d.push_front(3); cout<<d[0]<<" "<<d[1]<<" "<<d[2]<<endl; return 0; }程序输出 3 1 2
(3)使用insert()方法从中间插入元素,其参数有两个,第一个是迭代器参数,第二个是插入元素的值
#include<deque> #include<iostream> using namespace std; int main() { deque<int> d; d.push_back(1); d.push_back(2); d.push_back(3); d.insert(d.begin()+1,10); cout<<d[0]<<" "<<d[1]<<" "<<d[2]<<" "<<d[3]<<endl; return 0; }程序输出 1 10 2 3
前向遍历
(1)以数组方式遍历
#include<deque> #include<iostream> using namespace std; int main() { deque<int> d; d.push_back(1); d.push_back(2); d.push_back(3); for(int i=0;i<3;i++)cout<<d[i]<<" "; return 0; }
(2)以前向迭代器的方式遍历
#include<deque> #include<iostream> using namespace std; int main() { deque<int> d; d.push_back(1); d.push_back(2); d.push_back(3); deque<int>::iterator it; for(it=d.begin();it<d.end();it++)cout<<*it<<" "; return 0; }
反向遍历
采用反向迭代器对双端队列容器进行反向遍历
#include<deque> #include<iostream> using namespace std; int main() { deque<int> d; d.push_back(1); d.push_back(2); d.push_back(3); deque<int>::reverse_iterator rit; for(rit=d.rbegin();rit<d.rend();rit++)cout<<*rit<<" "; return 0; }输出 3 2 1
删除元素
可以从deque中的首部、尾部、中部删除元素,并可以清空双端队列容器。
(1)采用pop_front()方法从头部删除元素
#include<deque> #include<iostream> using namespace std; int main() { deque<int> d; for(int i=1;i<10;i++) d.push_back(i); d.pop_front(); d.pop_front(); deque<int>::iterator it; for(it=d.begin();it<d.end();it++)cout<<*it<<" "; return 0; }
输出 3 4 5 6 7 8 9
(2)采用pop_back()方法从尾部删除元素
#include<deque> #include<iostream> using namespace std; int main() { deque<int> d; for(int i=1;i<10;i++) d.push_back(i); d.pop_back(); d.pop_back(); deque<int>::iterator it; for(it=d.begin();it<d.end();it++)cout<<*it<<" "; return 0; }
输出:1 2 3 4 5 6 7
(3)使用erase()方法从中间删除元素,其参数是迭代器位置。
#include<deque> #include<iostream> using namespace std; int main() { deque<int> d; for(int i=1;i<10;i++) d.push_back(i); d.erase(d.begin()+2); d.erase(d.begin()+5); deque<int>::iterator it; for(it=d.begin();it<d.end();it++)cout<<*it<<" "; return 0; }
输出:1 2 4 5 6 8 9
(4)使用clear()方法清空deque对象
#include<deque> #include<iostream> using namespace std; int main() { deque<int> d; for(int i=1;i<10;i++) d.push_back(i); d.clear(); cout<<d.size()<<endl; return 0; }