网站开发的系统需求,北京专业做网站公司,俄罗斯最新消息今天新闻,wordpress移动端访问文章目录 deque的概念deque的使用deque的练习总结 deque的概念
deque(双端队列)#xff1a;是一种序列容器、是一种双开口的连续空间的数据结构#xff0c;双开口的含义是#xff1a;可以在头尾两端进行插入和删除操作#xff0c;且时间复杂度为O(1)#xff… 文章目录 deque的概念deque的使用deque的练习总结 deque的概念
deque(双端队列)是一种序列容器、是一种双开口的连续空间的数据结构双开口的含义是可以在头尾两端进行插入和删除操作且时间复杂度为O(1)与vector比较头插效率高不需要搬移元素与list比较空间利用率比较高。 deque并不是真正连续的空间而是由一段段连续的小空间拼接而成的实际deque类似于一个 动态的二维数组其底层结构如下图所示 双端队列底层是一段假象的连续空间实际是分段连续的为了维护其“整体连续”以及随机访问 的假象落在了deque的迭代器身上因此deque的迭代器设计就比较复杂如下图所示 deque是如何借助其迭代器维护其假想连续的结构
deque的使用
#include iostream
#include dequeint main() {// 创建一个整数类型的双端队列std::dequeint myDeque;// 在尾部添加元素myDeque.push_back(10);myDeque.push_back(20);// 在头部添加元素myDeque.push_front(5);// 访问和打印元素std::cout Elements in the deque: ;for (const auto element : myDeque) {std::cout element ;}std::cout std::endl;// 删除尾部元素myDeque.pop_back();// 删除头部元素myDeque.pop_front();// 再次打印元素std::cout Elements after pop operations: ;for (const auto element : myDeque) {std::cout element ;}std::cout std::endl;// 通过索引访问元素std::cout The first element is: myDeque[0] std::endl;return 0;
}双端队列的基本操作包括在两端添加和删除元素、遍历以及随机访问。通过这个例子可以更好地理解deque容器的特性和用法为在实际编程中使用双端队列提供了参考。
deque的练习
STL标准库中对于stack和queue的模拟实现 stack
#includedeque
namespace TU
{templateclass T, class Con dequeTclass stack{public:stack() {}void push(const T x) {_c.push_back(x); }void pop() {_c.pop_back(); }T top() { return _c.back(); }const T top()const { return _c.back(); }size_t size()const { return _c.size(); }bool empty()const { return _c.empty(); }private:Con _c;};
}代码实现了一个简单的栈stack容器模板类。它使用了 C 的模板技术可以存储不同类型的元素并可以指定底层容器的类型默认为deque。
queue
#includedeque
namespace TU
{templateclass T, class Con dequeTclass queue{public:queue() {}void push(const T x) { _c.push_back(x); }void pop() { _c.pop_front(); }T back() { return _c.back(); }const T back()const { return _c.back(); }T front() { return _c.front(); }const T front()const { return _c.front(); }size_t size()const { return _c.size(); }bool empty()const { return _c.empty(); }private:Con _c;};
}代码定义了一个名为queue的类模板实现了一个简单的队列数据结构。它使用了 C 的模板技术可以存储不同类型的元素并可以指定底层容器的类型默认为deque。这个队列支持基本的队列操作如入队、出队、获取队首和队尾元素、查询队列大小和判断队列是否为空。
总结
deque的特点 1.两端高效操作
deque的主要优势在于可以在其前端和后端快速地插入和删除元素时间复杂度均为常量级别。这使得它非常适合那些需要在队列两端频繁进行操作的场景比如实现栈在一端进行插入和删除和队列在两端分别进行插入和删除的数据结构。
2.动态大小
与其他标准容器一样deque可以根据需要自动调整其大小以容纳更多或更少的元素。它可以在运行时动态地增长或收缩无需预先确定其最大容量。
3.随机访问
deque支持随机访问元素就像数组一样。你可以使用下标运算符[]或迭代器在常量时间内访问任意位置的元素。这使得在需要随机访问元素的算法中deque也能发挥作用。
4.内存布局
deque的内部实现通常由多个固定大小的缓冲区组成。这些缓冲区在逻辑上形成一个连续的序列使得deque看起来像一个连续的容器。当需要在两端进行插入或删除操作时deque可以根据情况在适当的缓冲区中进行操作而不必像std::vector那样可能需要整体重新分配内存并移动元素。
deque的缺陷
与vector比较deque的优势是头部插入和删除时不需要搬移元素效率特别高而且在扩 容时也不需要搬移大量的元素因此其效率是必vector高的。与list比较其底层是连续空间空间利用率比较高不需要存储额外字段。但是deque有一个致命缺陷不适合遍历因为在遍历时deque的迭代器要频繁的去检测其是否移动到某段小空间的边界导致效率低下而序列式场景中可能需要经常遍历因此在实际中需要线性结构时大多数情况下优先考虑vector和listdeque的应用并不多而目前能看到的一个应用就是STL用其作为stack和queue的底层数据结构。
为什么选择deque作为stack和queue的底层默认容器 stack是一种后进先出的特殊线性数据结构因此只要具有push_back()和pop_back()操作的线性 结构都可以作为stack的底层容器比如vector和list都可以queue是先进先出的特殊线性数据 结构只要具有push_back和pop_front操作的线性结构都可以作为queue的底层容器比如 list。但是STL中对stack和queue默认选择deque作为其底层容器主要是因为
stack和queue不需要遍历(因此stack和queue没有迭代器)只需要在固定的一端或者两端进 行操作。在stack中元素增长时deque比vector的效率高(扩容时不需要搬移大量数据)queue中的 元素增长时deque不仅效率高而且内存使用率高。 结合了deque的优点而完美的避开了其缺陷。
使用场景 1.实现栈和队列
由于deque可以在两端高效地进行插入和删除操作它非常适合用来实现栈和队列。例如可以将元素从deque的一端推入表示入栈操作从同一端弹出表示出栈操作将元素从deque的一端推入表示入队操作从另一端弹出表示出队操作。
2.存储历史记录
可以用deque来存储用户操作的历史记录允许用户在一定范围内回溯和前进。新的操作可以添加到deque的一端而当用户回溯时可以从另一端删除元素。
3.广度优先搜索算法
在图的广度优先搜索算法中deque可以用来存储待访问的节点。从deque的一端取出节点进行访问并将其相邻的未访问节点添加到deque的另一端。这样可以保证先访问距离起点较近的节点。