STL中deque

以下学习一下STL中另一种序列容器——deque。

deque表示double-ended queue,即双向队列,deque是通过作为动态数组的方式实现的,这样可以在两端插入元素。因此,deque可以在任何一个方向进行扩展。同时可以在中间插入元素。在开头或结尾处插入元素非常的快,然而在中间插入元素将会比较耗时间,因此需要移动队列中的元素。

定义deque容器的类名为deque。类deque的定义以及deque对象的各种操作函数的实现包含在头文件<deque>中,因此,在程序中使用deque时,程序中必须包含如下语句:

#include <deque>

类deque中包含好几个构造器,因此,当声明一个deque对象时,可以通过各种方式进行初始化。如下表中提供的方式:

除了之前介绍的所有序列容器通用的操作意外,下表还描述了用来管理deque容器的元素的操作。各个语句展示了如何使用某一个特定的函数,其中假设deq是一个deque容器

下例展示了如何在程序中使用deque。

#include <iostream>
#include <deque>
#include <algorithm>
#include <iterator> using namespace std; int main()
{
deque<int> intDeq;
ostream_iterator<int> screen(cout, " "); intDeq.push_back(13);
intDeq.push_back(75);
intDeq.push_back(28);
intDeq.push_back(35); cout << "intDeq: ";
copy(intDeq.begin(), intDeq.end(), screen);
cout << endl; intDeq.push_front(0);
intDeq.push_back(100); cout << "After adding two more "
<< "elements, one at the front " << endl
<< " and one at the back, intDeq: "; copy(intDeq.begin(), intDeq.end(), screen);
cout << endl; intDeq.pop_front();
intDeq.pop_front(); cout << "After removing the first "
<< "two elements, " << endl
<< " intDeq: ";
copy(intDeq.begin(), intDeq.end(), screen);
cout << endl; intDeq.pop_back();
intDeq.pop_back(); cout << "After removing the last "
<< "two elements, " << endl
<< " intDeq: ";
copy(intDeq.begin(), intDeq.end(), screen);
cout << endl; deque<int>::iterator deqIt;
deqIt = intDeq.begin();
++deqIt;
intDeq.insert(deqIt, 666); cout << "After inserting 666, "
<< "intDeq: ";
copy(intDeq.begin(), intDeq.end(), screen);
cout << endl; intDeq.assign(2, 45); cout << "After assigning two "
<< "copies of 45, intDeq: ";
copy(intDeq.begin(), intDeq.end(), screen);
cout << endl; intDeq.push_front(-10);
intDeq.push_front(-999); cout << "After inserting two "
<< "elements, one at the front " << endl
<< " and one at the back, intDeq: ";
copy(intDeq.begin(), intDeq.end(), screen);
cout << endl; return 0;
}

输出为:

STL中deque的相关教程结束。

相关推荐:

Python队列怎么用_queue模块与collections.deque性能对比

优先选collections.deque用于单线程场景,因其O(1)两端操作、无锁高效;多线程协调必须用queue.Queue,它提供阻塞、超时及线程安全保证。 用queue.Queue还是collections.deque?看场景 不是“哪个更好”,而是“谁更合适”。queue.Queue是为多线...

Python队列怎么实现_collections.deque双端队列应用

deque比list更适合作队列,因其两端操作均为o(1),而list的pop(0)/insert(0)为o(n);适用bfs、滑动窗口等场景,但不适用于高频随机访问;需注意maxlen不可变、extendleft顺序反转、非线程安全及转list开销大等问题。 deque为什么比list做队列更合适...

Python deque 在高并发场景下的优势

deque比list更适合高并发队列操作,因其两端增删为o(1),而list头部操作为o(n),可减少锁竞争、提升吞吐;但deque本身线程不安全,需配合queue.queue等线程安全封装使用。 deque为什么比list更适合高并发的队列操作 因为deque的两端插入和删除是O(1)时间复杂度,...

Python deque 在高性能场景中的优势

deque比list更适合高频头尾操作,因其双向链表实现使头尾增删为O(1),而list的动态数组特性导致头插/头删需移动元素、最坏O(n),在消息队列等场景直接影响延迟与CPU。 为什么deque比list更适合高频头尾操作 因为deque是双向链表实现,头尾插入/删除都是O(1);而list是动...

Python deque 的高性能场景

deque比list更快处理队列操作,因其底层用分块数组实现双向队列,两端增删为O(1),而list的pop(0)需移动元素、最坏O(n);注意maxlen自动截断和线程安全仅限单个操作。 为什么deque比list更快处理队列操作 deque底层用双向链表(实际是分块数组)实现,两端插入和删除都是...

在多线程中不加锁使用 collections.deque 是否安全

collections.deque的单个原子操作线程安全,但复合操作(如判空后popleft、len后修改、索引访问并发修改、迭代中修改)会因竞态导致异常或逻辑错误;只读、独占实例、用queue.Queue封装或极低并发容忍错误时可不加锁。 collections.deque的线程安全性是有限的 c...

Python list vs deque 的使用选择

该用deque而不是list的情况是当操作集中在序列两端且需O(1)复杂度时,如实现队列、滑动窗口、BFS、命令栈;若频繁随机索引或切片,则应选list。 什么时候该用deque而不是list 当操作集中在序列两端(尤其是频繁appendleft()、popleft()或pop()+append()...