deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,deque在接口上和vector非常相似,下面列出deque的常用成员函数:
deque的实现比较复杂,内部会维护一个map(注意!不是STL中的map容器)即一小块连续的空间,该空间中每个元素都是指针,指向另一段(较大的)区域,这个区域称为缓冲区,缓冲区用来保存deque中的数据。因此deque在随机访问和遍历数据会比vector慢。具体的deque实现可以参考《STL源码剖析》,当然此书中使用的SGI STL与VS2008所使用的PJ STL的实现方法还是有区别的。下面给出了deque的结构图:
//双向队列 deque //by MoreWindows http://blog.csdn.net/morewindows #include <deque> #include <cstdio> #include <algorithm> using namespace std; int main() { deque<int> ideq(20); //Create a deque ideq with 20 elements of default value 0 deque<int>::iterator pos; int i; //使用assign()赋值 assign在计算机中就是赋值的意思 for (i = 0; i < 20; ++i) ideq[i] = i; //输出deque printf("输出deque中数据:\n"); for (i = 0; i < 20; ++i) printf("%d ", ideq[i]); putchar('\n'); //在头尾加入新数据 printf("\n在头尾加入新数据...\n"); ideq.push_back(100); ideq.push_front(i); //输出deque printf("\n输出deque中数据:\n"); for (pos = ideq.begin(); pos != ideq.end(); pos++) printf("%d ", *pos); putchar('\n'); //查找 const int FINDNUMBER = 19; printf("\n查找%d\n", FINDNUMBER); pos = find(ideq.begin(), ideq.end(), FINDNUMBER); if (pos != ideq.end()) printf("find %d success\n", *pos); else printf("find failed\n"); //在头尾删除数据 printf("\n在头尾删除数据...\n"); ideq.pop_back(); ideq.pop_front(); //输出deque printf("\n输出deque中数据:\n"); for (pos = ideq.begin(); pos != ideq.end(); pos++) printf("%d ", *pos); putchar('\n'); return 0; }
以上内容均转之:http://blog.csdn.net/morewindows/article/details/6946811
关于面试中遇到优先队列的题目有以下:
题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
例如输入
8
/ \
6 10
/\ /\
5 7 9 11
输出8 6 10 5 7 9 11。
我们从树的根结点开始分析。自然先应该打印根结点8,同时为了下次能够打印8的两个子结点,我们应该在遍历到8时把子结点6和10保存到一个数据容器中。现在数据容器中就有两个元素6 和10了。按照从左往右的要求,我们先取出6访问。打印6的同时要把6的两个子结点5和7放入数据容器中,此时数据容器中有三个元素10、5和7。接下来我们应该从数据容器中取出结点10访问了。注意10比5和7先放入容器,此时又比5和7先取出,就是我们通常说的先入先出。因此不难看出这个数据容器的类型应该是个队列。
既然已经确定数据容器是一个队列,现在的问题变成怎么实现队列了。实际上我们无需自己动手实现一个,因为STL已经为我们实现了一个很好的deque(两端都可以进出的队列),我们只需要拿过来用就可以了。
我们知道树是图的一种特殊退化形式。同时如果对图的深度优先遍历和广度优先遍历有比较深刻的理解,将不难看出这种遍历方式实际上是一种广度优先遍历。因此这道题的本质是在二元树上实现广度优先遍历。
代码如下:
#include <deque> #include <iostream> using namespace std; struct BTreeNode // a node in the binary tree { int m_nValue; // value of node BTreeNode *m_pLeft; // left child of node BTreeNode *m_pRight; // right child of node }; /////////////////////////////////////////////////////////////////////// // Print a binary tree from top level to bottom level // Input: pTreeRoot - the root of binary tree /////////////////////////////////////////////////////////////////////// void PrintFromTopToBottom(BTreeNode *pTreeRoot) { if(!pTreeRoot) return; // get a empty queue deque<BTreeNode *> dequeTreeNode; // insert the root at the tail of queue dequeTreeNode.push_back(pTreeRoot); while(dequeTreeNode.size()) { // get a node from the head of queue BTreeNode *pNode = dequeTreeNode.front(); dequeTreeNode.pop_front(); // print the node cout << pNode->m_nValue << ' '; // print its left child sub-tree if it has if(pNode->m_pLeft) dequeTreeNode.push_back(pNode->m_pLeft); // print its right child sub-tree if it has if(pNode->m_pRight) dequeTreeNode.push_back(pNode->m_pRight); } } PS:层序二叉树,用队列实现!
相关推荐
**STL中的deque容器详解** `deque`(双端队列)是C++标准模板库(STL)中的一种重要容器,它提供了类似数组的功能,同时支持在两端进行高效插入和删除操作。与vector相比,deque在两端操作时通常具有更好的性能,...
C++实现STL容器之deque
STL中的deque模板包括迭代器等接口
stl30版本中容器deque的源码
stl30版本中容器deque所引用的头文件,但deque具体实现在std_deque.h
在"STL学习教程word版"中,初学者可以深入理解STL的核心概念和应用。STL的核心是它的四大组件: 1. **容器**:容器是STL的基础,它们存储和管理元素集合。常见的容器有vector(动态数组)、list(双向链表)、deque...
在STL中,`deque`(双端队列)是一种重要的容器,它允许在两端进行快速的插入和删除操作。本篇文章将深入探讨`deque`的实现原理、特性以及相关的编程实践。 `deque`,全称Double Ended Queue,其设计灵感来源于线性...
STL的学习文档则会深入讲解STL的核心组件,包括容器(如vector、list、deque、set和map)、迭代器、算法(如排序、查找和转换)以及仿函数(functors)。STL容器提供了一种存储和组织数据的方式,而迭代器则允许...
【STL源码剖析】deque 的使用
这篇学习笔记将深入探讨STL的核心概念、主要组件以及其在实际编程中的应用。 首先,STL的核心概念是容器、迭代器、算法和函数对象。容器是STL提供的一系列数据结构,如vector(动态数组)、list(双向链表)、set...
其中,`std::deque`(双端队列)是STL容器之一,它与`std::vector`类似,但有其独特的优势。这篇深入研究C++中的STL `deque`容器的文章旨在探讨在什么情况下`deque`比`vector`更合适,并分析两者在内存管理和性能上...
"STL_tutorial_reference.pdf"则很可能是STL的教程与参考手册,详细介绍了STL的各种组件,包括容器(如vector、list、deque、set、map等)、迭代器的使用方式、算法库(如排序、查找、变换等)以及函数对象(如比较...
STL,全称为Standard Template Library(标准模板库),是C++编程语言中不可或缺的一部分,它提供了高效、可...通过深入学习STL,你可以更好地理解和利用C++的强大力量,从而编写出更加高效、简洁和易于维护的程序。
STL的学习不仅仅是理解这些基本概念,还包括深入理解其内部实现机制,例如容器如何管理内存,迭代器如何工作,以及算法的效率分析等。通过实践和应用,开发者可以更好地利用STL提高代码的效率和可读性。
1. 容器:这是STL提供的一系列内置数据结构,如vector(动态数组)、list(双向链表)、deque(双端队列)、set(集合)、map(映射)、unordered_set(无序集合)、unordered_map(无序映射)等。每个容器都有其...
STL容器主要分为序列容器和关联容器,序列容器如vector、list和deque,关联容器如set、multiset、map和multimap。容器是模板类,可以在编译时确定容器元素的数据类型。 迭代器是一种能够遍历STL容器中元素的对象。...
STL,全称为Standard Template Library(标准模板库),是C++编程语言中不可或缺的一部分,它提供了高效、灵活的容器、迭代器、...STL不仅简化了编程,还提高了代码的可读性和可维护性,是C++程序员必备的技能之一。
- **容器**:STL提供了多种容器,如`vector`、`list`、`deque`、`set`、`map`等,它们用于存储和管理对象集合。其中,`vector`是最常用的动态数组,支持随机访问和高效插入/删除操作;`list`则是一组双向链表,适合...
容器是STL中最基础也是最重要的组成部分之一,它们用来存储数据。STL提供了多种类型的容器,每种容器都有其特定的应用场景和特点。 - **`vector`**:动态数组,能够根据需要自动调整大小。它支持随机访问,并且在...
1. 容器:STL的核心组成部分之一,它们是数据结构的模板类,如vector(动态数组)、list(双向链表)、deque(双端队列)、set(集合)、map(映射)和unordered_map(无序映射)等。每个容器都有其特定的内存管理和...