`

STL 学习之deque

    博客分类:
  • STL
 
阅读更多

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时把子结点610保存到一个数据容器中。现在数据容器中就有两个元素10了。按照从左往右的要求,我们先取出6访问。打印6的同时要把6的两个子结点57放入数据容器中,此时数据容器中有三个元素1057。接下来我们应该从数据容器中取出结点10访问了。注意1057先放入容器,此时又比57先取出,就是我们通常说的先入先出。因此不难看出这个数据容器的类型应该是个队列。

既然已经确定数据容器是一个队列,现在的问题变成怎么实现队列了。实际上我们无需自己动手实现一个,因为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:层序二叉树,用队列实现!

 

 

  • 大小: 139.9 KB
  • 大小: 64.5 KB
分享到:
评论

相关推荐

    STL的容器deque的使用

    **STL中的deque容器详解** `deque`(双端队列)是C++标准模板库(STL)中的一种重要容器,它提供了类似数组的功能,同时支持在两端进行高效插入和删除操作。与vector相比,deque在两端操作时通常具有更好的性能,...

    C++实现STL容器之deque

    C++实现STL容器之deque

    deque(STL)

    STL中的deque模板包括迭代器等接口

    stl-deque.h (C++STL deque的源码)

    stl30版本中容器deque的源码

    deque.h (包含stl-deque.h的头文件)

    stl30版本中容器deque所引用的头文件,但deque具体实现在std_deque.h

    STL学习教程word版

    在"STL学习教程word版"中,初学者可以深入理解STL的核心概念和应用。STL的核心是它的四大组件: 1. **容器**:容器是STL的基础,它们存储和管理元素集合。常见的容器有vector(动态数组)、list(双向链表)、deque...

    SGI STL deque相关代码

    在STL中,`deque`(双端队列)是一种重要的容器,它允许在两端进行快速的插入和删除操作。本篇文章将深入探讨`deque`的实现原理、特性以及相关的编程实践。 `deque`,全称Double Ended Queue,其设计灵感来源于线性...

    C++&STL学习资料

    STL的学习文档则会深入讲解STL的核心组件,包括容器(如vector、list、deque、set和map)、迭代器、算法(如排序、查找和转换)以及仿函数(functors)。STL容器提供了一种存储和组织数据的方式,而迭代器则允许...

    【STL源码剖析】deque 的使用

    【STL源码剖析】deque 的使用

    c++ -- stl 学习笔记

    这篇学习笔记将深入探讨STL的核心概念、主要组件以及其在实际编程中的应用。 首先,STL的核心概念是容器、迭代器、算法和函数对象。容器是STL提供的一系列数据结构,如vector(动态数组)、list(双向链表)、set...

    深入研究 C++中的 STL Deque 容器

    其中,`std::deque`(双端队列)是STL容器之一,它与`std::vector`类似,但有其独特的优势。这篇深入研究C++中的STL `deque`容器的文章旨在探讨在什么情况下`deque`比`vector`更合适,并分析两者在内存管理和性能上...

    STL学习参考资料合集(PDF)

    "STL_tutorial_reference.pdf"则很可能是STL的教程与参考手册,详细介绍了STL的各种组件,包括容器(如vector、list、deque、set、map等)、迭代器的使用方式、算法库(如排序、查找、变换等)以及函数对象(如比较...

    STL 学习资料STL 学习资料

    STL,全称为Standard Template Library(标准模板库),是C++编程语言中不可或缺的一部分,它提供了高效、可...通过深入学习STL,你可以更好地理解和利用C++的强大力量,从而编写出更加高效、简洁和易于维护的程序。

    STL学习资料 收集

    STL的学习不仅仅是理解这些基本概念,还包括深入理解其内部实现机制,例如容器如何管理内存,迭代器如何工作,以及算法的效率分析等。通过实践和应用,开发者可以更好地利用STL提高代码的效率和可读性。

    STL学习资料

    1. 容器:这是STL提供的一系列内置数据结构,如vector(动态数组)、list(双向链表)、deque(双端队列)、set(集合)、map(映射)、unordered_set(无序集合)、unordered_map(无序映射)等。每个容器都有其...

    C++STL学习笔记.pdf

    STL容器主要分为序列容器和关联容器,序列容器如vector、list和deque,关联容器如set、multiset、map和multimap。容器是模板类,可以在编译时确定容器元素的数据类型。 迭代器是一种能够遍历STL容器中元素的对象。...

    stl模板视频学习教程.rar

    STL,全称为Standard Template Library(标准模板库),是C++编程语言中不可或缺的一部分,它提供了高效、灵活的容器、迭代器、...STL不仅简化了编程,还提高了代码的可读性和可维护性,是C++程序员必备的技能之一。

    STL学习笔记

    - **容器**:STL提供了多种容器,如`vector`、`list`、`deque`、`set`、`map`等,它们用于存储和管理对象集合。其中,`vector`是最常用的动态数组,支持随机访问和高效插入/删除操作;`list`则是一组双向链表,适合...

    stl学习文档

    容器是STL中最基础也是最重要的组成部分之一,它们用来存储数据。STL提供了多种类型的容器,每种容器都有其特定的应用场景和特点。 - **`vector`**:动态数组,能够根据需要自动调整大小。它支持随机访问,并且在...

    C++ STL学习资料

    1. 容器:STL的核心组成部分之一,它们是数据结构的模板类,如vector(动态数组)、list(双向链表)、deque(双端队列)、set(集合)、map(映射)和unordered_map(无序映射)等。每个容器都有其特定的内存管理和...

Global site tag (gtag.js) - Google Analytics