码迷,mamicode.com
首页 > 其他好文 > 详细

deque双端队列容器

时间:2015-08-13 14:23:23      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:c++   stl   容器   deque   

C++中的STL还是比较有用的,尤其是在做科研实现算法的时候,之前也有用过,但是没怎么系统地学过,因此最近找了本书,大致浏览了一下,叶志军的那本《C++ STL开发技术导引》,科普、入门性质的一本书,写得比较浅[呵呵,勿喷]。下面的内容大部分是摘自该书。
deque双端队列容器(double-ended queue),可以在尾部、头部插入、删除元素,采用分块的线性结构来存储数据,两个迭代器分别指向容器的首尾元素,以deque块为单位进行内存分配,使用二级的Map进行管理。

创建deque对象

有以下几种方式来创建deque容器对象。
(1) deque()
该种方式所创建的deque容器已经具有一个对象,只是头尾迭代器重叠,容器中还没有任何元素。

deque<int> d;

(2) deque(size_type n)
创建一个具有n个元素的deque对象,每个元素采用对应类型的默认值。

deque<int> d(10);//10个元素的初始值为0

(3) deque(size_type n,const T& value)
创建一个具有n个元素的deque对象,这些元素的初始值为value。

deque<double> d(10,2.5);

(4) deque(const deque&)
拷贝构造函数。

deque<char> d1(5,’k’);
deque<char> d2(d1);

(5) deque(const InputIterator first,const InputIterator last,const A&a=A())

int array[]={1,2,3,4,5};
deque<int>d(array,array+5);

deque初始化

利用push_back函数在尾部压入新元素。

deque<int> d;
d.push_back(10);

元素的遍历访问

可以采用数组和迭代器的方式进行访问。
利用数组方式访问deque元素:

#include<iostream>
#include<deque>
using namespace std;
int main()
{
    deque<int> d;
    d.push_back(1);
    d.push_back(2);
    d.push_back(3);
    d.push_back(4);
    for(int i=0;i<d.size();i++)
    {
        cout<<"d["<<i<<"]="<<d[i]<<endl;
    }
    return 0;
}

用迭代器方式访问deque元素:

#include<iostream>
#include<deque>
using namespace std;
int main()
{
    deque<int> d;
    d.push_back(1);
    d.push_back(2);
    d.push_back(3);
    d.push_back(4);
    deque<int>::iterator begin,end;
    end=d.end();
    int i;
    for(begin=d.begin(),i=0;begin!=end;begin++,i++)
    {
        cout<<*begin<<endl;
    }
    return 0;
}

元素的插入

deque使用了两个迭代器分别指向双端队列的首尾,deque有高效的头部插入元素的函数push_front(),其原型为:

void push_front(const T&);

其他位置的插入涉及元素的移位拷贝,insert函数在pos位置之前插入元素x,

Iterator insert(iterator pos,const T& x);

例:

#include<iostream>
#include<deque>
using namespace std;
int main()
{
    deque<int> d;
    d.push_back(1);
    d.push_back(2);
    //头部插入
    d.push_front(3);
    for(int i=0;i<d.size();i++)
    {
        cout<<d[i]<<" ";
    } 
    cout<<endl;
    //中间位置插入
    d.insert(d.begin()+2,4);//在第3个元素之前插入4
    for(int i=0;i<d.size();i++)
        cout<<d[i]<<" ";
    cout<<endl; 
    return 0;
}

元素的删除

删除首元素pop_front函数,删除尾元素pop_back函数,删除任意位置或者迭代区间erase函数,删除所有元素clear函数。

#include<iostream>
#include<deque>
using namespace std;
int main()
{
    deque<int> d;
    d.push_back(1);
    d.push_back(2);
    d.push_back(3);
    d.push_back(4);
    d.push_back(5);
    for(int i=0;i<d.size();i++)
    {
        cout<<d[i]<<" ";
    }
    cout<<endl;
    //头尾和任意位置删除元素
    d.erase(d.begin()+2);//删除第3个元素
    d.pop_front();
    d.pop_back();
    for(int i=0;i<d.size();i++)
    {
        cout<<d[i]<<" ";
    } 
    cout<<endl;
    d.clear();//删除所有元素 
    cout<<d.size()<<endl; 
    return 0;
}

元素的反向遍历

反向迭代器reverse_iterator和const_reverse_iterator。

#include<iostream>
#include<deque>
using namespace std;
int main()
{
    deque<int> d;
    d.push_back(1);
    d.push_back(2);
    d.push_back(3);
    d.push_back(4);
    d.push_back(5);
    //前向遍历 
    deque<int>::iterator begin,end;
    end=d.end();
    for(begin=d.begin();begin!=end;begin++)
        cout<<*begin<<" ";
    cout<<endl;
    //反向遍历
    deque<int>::reverse_iterator rbegin,rend;
    rend=d.rend();
    for(rbegin=d.rbegin();rbegin!=rend;rbegin++)
        cout<<*rbegin<<" "; 
    cout<<endl;
    return 0;
}

deque的交换

利用swap函数进行交换。

#include<iostream>
#include<deque>
using namespace std;
void print(deque<int> &d)
{
    for(int i=0;i<d.size();i++)
        cout<<d[i]<<" ";
    cout<<endl;
}
int main()
{
    //d1
    deque<int> d1;
    d1.push_back(1);
    d1.push_back(2);
    cout<<"-----------交换前:"<<endl;
    cout<<"d1=";
    print(d1);
    //d2
    deque<int> d2;
    d2.push_back(3);
    d2.push_back(4);
    d2.push_back(5);
    cout<<"d2=";
    print(d2);
    cout<<"-----------交换后:"<<endl;
    d1.swap(d2); 
    cout<<"d1=";
    print(d1);
    cout<<"d2=";
    print(d2);

    return 0;
}

技术分享

其他函数

bool empty()
size_type size()
size_type max_size()
reference front()
reference back()

版权声明:本文为博主原创文章,未经博主允许不得转载。

deque双端队列容器

标签:c++   stl   容器   deque   

原文地址:http://blog.csdn.net/u011000290/article/details/47611509

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!