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()

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

时间: 2024-11-10 14:01:06

deque双端队列容器的相关文章

stl之deque双端队列容器

deque与vector很相似,不仅能够在尾部插入和删除元素,还能够在头部插入和删除. 只是当考虑到容器元素的内存分配策略和操作性能时.deque相对vector较为有优势. 头文件 #include<deque> 创建deque对象 1)deque();//创建一个没有不论什么元素的deque对象. deque<int> d 2)deque(size_typen);//创建一个具有n个元素的deque对象.每一个元素採用它的类型下的默认值. deque<int> d(

deque双端队列容器(对象创建,数组、迭代器方式访问,元素的赋值、插入、删除等)

deque与vector非常相似,不仅可以在尾部插入和删除元素,还可以在头部插入和删除.不过当考虑到容器元素的内存分配策略和操作性能时,deque相对vector较为有优势. 头文件 #include<deque> 创建deque对象 1)deque();//创建一个没有任何元素的deque对象. deque<int> d 2)deque(size_typen);//创建一个具有n个元素的deque对象,每个元素采用它的类型下的默认值. deque<int> d(10)

STL容器:deque双端队列学习

所谓deque,是"double-ended queue"的缩写; 它是一种动态数组形式,可以向两端发展,在尾部和头部插入元素非常迅速; 在中间插入元素比较费时,因为需要移动其它元素;(No) 双端队列容器,在序列的两端放置和删除元素是高效的; 而vector只是在序列末尾插入才是高效的. C++ Code 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495

8、泛型程序设计与c++标准模板库2.3双端队列容器

双端队列容器是一种放松了访问权限的队列.除了从队列的首部和尾部访问元素外,标准的双端队列也支持通过使用下标操作符"[]"进行直接访问. 它提供了直接访问和顺序访问方法.其头文件为<deque>. 1)双端队列容器的构造函数 有4中形式的构造函数: deque();//构造size()为0的双端队列容器 deque(size_type n,const T& v=T());//初始化大小为n的双端队列,第二个参数是每个元素的初始值,默认为T()构造的对象 deque(c

std::deque双端队列介绍

在建立vector容器时,一般来说伴随这建立空间->填充数据->重建更大空间->复制原空间数据->删除原空间->添加新数据,如此反复,保证vector始终是一块独立的连续内存空间:在建立deque容器时,一般便随着建立空间->建立数据->建立新空间->填充新数据,如此反复,没有原空间数据的复制和删除过程,是由多个连续的内存空间组成的. C++ STL容器deque和vector很类似,也是采用动态数组来管理元素. 与vector不同的是deque的动态数组首

c++ deque 双端队列

双端队列: 函数 描述 c.assign(beg,end)c.assign(n,elem)  将[beg; end)区间中的数据赋值给c.将n个elem的拷贝赋值给c. c.at(idx)  传回索引idx所指的数据,如果idx越界,抛出out_of_range. c.back()  传回最后一个数据,不检查这个数据是否存在. c.begin()  传回迭代器重的可一个数据. c.clear()  移除容器中所有数据. deque<Elem> cdeque<Elem> c1(c2)

Deque 双端队列

Deque允许在队列的头部或尾部进行出队和入队操作 LinkedBlockingDeque是一个线程安全的双端队列实现,可以说他是最为复杂的一种队列,在内部实现维护了前端和后端节点,但是其没有实现读写分离,因此同一时间只能有一个线程对其进行操作.在高并发中性能要远低于其他BlockingQueue.更要低于ConcurrentLinkedQueue,在jdk早期有一个非线程安全的Deque就是ArrayDeque了,java6里添加了LinkedBlockingDeque来弥补多线程场景下线程安

设计循环队列——写起来最清爽的还使用原生的deque 双端队列

622. 设计循环队列 难度中等89收藏分享切换为英文关注反馈 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为“环形缓冲器”. 循环队列的一个好处是我们可以利用这个队列之前用过的空间.在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间.但是使用循环队列,我们能使用这些空间去存储新的值. 你的实现应该支持如下操作: MyCircularQueue(k): 构造器,设置队

deque双端队列用法

#include <iostream> #include <cstdio> #include <deque> #include <algorithm> using namespace std; deque<int> dq; int main() { dq.push_front(102);///插入头部 dq.push_back(101);///插入尾部 sort(dq.begin(),dq.end()); deque<int>::it