C++中STL容器之双端队列——dequeue

1.双端队列介绍

双端队列(dequeue) 与vector很类似,采用线性表顺序存储结构,且支持随机访问,即可以直接用下标来访问元素。但与vector有区别:

deque采用分块的线性存储结构来存储数据,每块的大小一般为512B,将之称为deque块;

所有的deque块使用一个map块进行管理,每个map数据项记录各个deque块的首地址,所以允许较为快速的随机访问;

即它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结构中保存对这些块及其顺序的跟踪;

这样的话,deque块在头部和尾部都可以插入和删除,而不需要移动其他元素。

1.使用push_back()方法在尾部插入元素,会扩张队列;

2.使用push_front()方法在首部插入元素和使用insert()方法在中间插入元素(覆盖原有元素,不会增加新元素)。

一般来说,当考虑到容器元素的内存分配策略和操作的性能时deque相当于vector更有优势。它是vector和list的结合,复杂度处于二者之间。

复杂度

操作 复杂度

push_front() O(1)

pop_front() O(1)

push_back() O(1)

pop_back() O(1)

insert() O(n)

erase() O(n)

访问 O(1)

2.双端队列基本用法

2.1 dequeue的创建

与vector类似,deque<Type> d;

2.2 dequeue常见用法

操作 含义

a.push_back(e) 在尾部插入元素e,会不断扩张队列

a.push_front(e) 在头部插入元素e

a.pop_front() 在头部删除数据

a.pop_back() 在尾部删除数据

a.resize(num) 重新指定队列的长度

a.size() 返回容器中实际数据个数

a.max_size() //返回容器中最大数据的数量

简单测试代码:

root@fanpf:~/cpp_demos# cat deque.cpp

/****************************************************************************

@file:dequeue.cpp

@author:ebayboy@163.com

@date:2019-10-14 11:15

@version 1.0 

@description: cpp file

@Copyright (c)  all right reserved

**************************************************************************/

#include <iostream>

#include <deque>

using namespace std;

void show_deque(deque <int> d)

{

        for (deque<int>::iterator it=d.begin();

                        it != d.end(); it++) {

                cout << *it << " ";

        }

        cout << endl;

}

void show_deque2(deque <int> d)

{

        cout << __func__ << ":" << __LINE__ << endl;

        for (size_t i = 0; i < d.size(); i++) {

                cout << d[i] << " ";

        }

        cout << endl;

}

int main(int argc, char **argv)

{

        deque <int> d;

        /* push back */

        for (int i = 0; i <=5; i++) {

                d.push_back(i);

        }

        cout << endl << "push back:" << endl;

        show_deque(d);

        /* push front */

        d.push_front(6);

        d.push_front(7);

        cout << endl << "push front" << endl;

        show_deque(d);

        /* pop front */

        d.pop_front();

        cout << endl << "pop front:" << endl;

        show_deque(d);

        /* pop back */

        d.pop_back();

        cout << endl << "pop back:" << endl;

        show_deque(d);

        /* insert at pos */

        d.insert(d.begin()+ 1, 100);

        cout << endl << "insert at pos d.begin()+ 1):" << endl;

        show_deque(d);

        /* del at pos d.end() - 2 )*/

        d.erase(d.end() - 2);

        cout << endl << "del at pos - 2" << endl;

        show_deque(d);

        cout << "size:" << d.size() << endl;

        cout << "resize -> 2:" << endl;

        d.resize(2);

        show_deque(d);

        cout << "clear all:" << endl;

        d.clear();

        show_deque(d);

        return 0;

}

程序的输出:

root@fanpf:~/cpp_demos# ./deque

push back:

0 1 2 3 4 5

push front

7 6 0 1 2 3 4 5

pop front:

6 0 1 2 3 4 5

pop back:

6 0 1 2 3 4

insert at pos d.begin()+ 1):

6 100 0 1 2 3 4

del at pos - 2

6 100 0 1 2 4

size:6

resize -> 2:

6 100

clear all:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容