Queue和java stack queue的区别

vector,map,list,queue的区别详细解析
字体:[ ] 类型:转载 时间:
如果我们需要随机访问一个容器则vector要比list好得多。如果我们已知要存储元素的个数则vector 又是一个比list好的选择。如果我们需要的不只是在容器两端插入和删除元素则list显然要比vector好
1。vector& (连续的空间存储,可以使用[]操作符)快速的访问随机的元素,快速的在末尾插入元素,但是在序列中间岁间的插入,删除元素要慢,而且如果一开始分配的空间不够的话,有一个重新分配更大空间,然后拷贝的性能开销.
2。deque (小片的连续,小片间用链表相连,实际上内部有一个map的指针,因为知道类型,所以还是可以使用[],只是速度没有vector快)快速的访问随机的元素,快速的在开始和末尾插入元素,随机的插入,删除元素要慢,空间的重新分配要比vector快,重新分配空间后,原有的元素不需要拷贝。对deque的排序操作,可将deque先复制到vector,排序后在复制回deque。
3。list&& (每个元素间用链表相连)访问随机元素不如vector快,随机的插入元素比vector快,对每个元素分配空间,所以不存在空间不够,重新分配的情况
4。set 内部元素唯一,用一棵平衡树结构来存储,因此遍历的时候就排序了,查找也比较快的哦。
5。map 一对一的映射的结合,key不能重复。
6。stack 适配器,必须结合其他的容器使用,stl中默认的内部容器是deque。先进后出,只有一个出口,不允许遍历。
7。queue 是受限制的deque,内部容器一般使用list较简单。先进先出,不允许遍历。
下面是选择顺序容器类型的一些准则& 1.如果我们需要随机访问一个容器则vector要比list好得多 。2.如果我们已知要存储元素的个数则vector 又是一个比list好的选择。& 3.如果我们需要的不只是在容器两端插入和删除元素则list显然要比vector好& 4.除非我们需要在容器首部插入和删除元素否则vector要比deque好。5.如果只在容易的首部和尾部插入数据元素,则选择deque.6.如果只需要在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑输入时将元素读入到一个List容器,接着对此容器重新拍学,使其适合顺序访问,然后将排序后的list容器复制到一个vector容器中
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具二次元同好交流新大陆
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
新浪微博:/sincerecorner
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(8748)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'C++ STL--stack/queue 的使用方法',
blogAbstract:'
1、stack stack 模板类的定义在&stack&头文件中。 stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要 的,在不指定容器类型时,默认的容器类型为deque。 定义stack 对象的示例代码如下: stack&int& s1; stack&string& s2; stack 的基本操作有: 入栈,如例:s.push(x);',
blogTag:'c/c++',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:3,
publishTime:2,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:3,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:true,
hostIntro:'新浪微博:/sincerecorner',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}1582人阅读
4.C/C++(44)
模版类stack,它是一个后进现出的容器适配器--即自己不直接维护被控序列的模版类,而是它存储的容器对象来为它实现所有的功能;
typedef stack&T,deque&T,allocator&T&&&&
默认的参数中容器是用deque实现的;被包含的容器要满足提供value_type,size_type,empt,size, push_back,pop_back;可选择的容器有list,deque,vector;要求有最快的平均访问速度,而且大概的容量要求也清楚(比较 衡定),那么,使用vector是个不错的选择 要求每次的访问时间平稳,而不在乎平均访问时间时,那么,可以考虑使用list;所以,库默认的deque是个不错的选择,它介于vector和list 之间,并且很好的综合了两者的优势;
构造函数:
stack() 声明一个空栈;
stack(mycont) 声明一个初始内容复制自mycont的栈;
push 将一个新元素压倒栈中;
pop 弹出栈中的元素,如果栈为空,结果未定义,函数返回void;
top 存取栈的顶端元素,如果栈为空,结果未定义,返回的是一个引用;
empty 测试栈是否为空;
size 获得栈中元素的个数;
常用的六个比较函数;
queue和priority_queue都是容器适配器,queue实现的是先进现出一个队列,priority_queue也是一个队列不过该 模版类可以保证每次通过pop从它里面取得的元素都是剩下元素中优先级最高的,在每次通过push添加元素时,整个序列都会在必要时进行重排,它使用堆算 法保持序列的有序化。
typedef queue&T,deque&T,allocator&T&&&
构造函数:
queue() 声明一个空队列;
queue(mycont) 声明一个队列它的初始内容复制自
push 将一个新元素接到队列的末端;
pop 弹出队列中的第一个元素,返回的是一个void;
front&&存取队列中的第一个元素,返回的是一个引用;
back 存取队列中最后一个元素,返回的是一个引用;
empty 测试队列是否为空;
size 获得队列中元素的个数;
常见的六种比较操作;
typedef priority_queue&T,vector&T,allocator&T&&,less&T&&
构造函数:
priority_queue() 声明一个按pred()排序的空优先队列;
priority_queue(pr) 声明一个按函数对象pr排序的空优先队列;
priority_queue(pr,mycont), 声明一个按pr排序的优先队列,它的初始内容是从mycont中复制过来并排序的;
priority_queue(first,last) 声明一个按pred()排序的优先队列,初始内容从指定序列中复制过来的;
priority_queue(first,last,pr) 声明一个按pr排序的优先队列,它的初始内容是从指定的序列中复制过来并排序的;
priority_queue(first,last,mycont,pr) 声明一个按pr排序的优先队列,它的初始内容复制从mycont中指定的段并排序;
push 向优先队列中压入一个新元素;
pop 从优先队列中弹出它的顶端元素,返回值是void;
top 存取优先队列中顶端的元素,返回的是一个常量的引用;
empty size 测试优先队列是否为空;获得优先队列中元素的个数;
常用的六种比较操作;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:132529次
积分:1894
积分:1894
排名:第14888名
原创:40篇
转载:77篇
评论:19条您所在的位置: &
4.4 用对应的泛型替换Stack和Queue(1)
4.4 用对应的泛型替换Stack和Queue(1)
清华大学出版社
《C#3.0cookbook中文版》《C#3.0cookbook中文版》本书侧重于解决C#程序员在开发应用程序时遇到的各类问题,并以此组织全书内容。这些解决方案称为秘诀;每个秘诀都包含一个问题,他的解决方案及相关信息的讨论。 本节为大家介绍的是用对应的泛型替换Stack和Queue。
4.4 用对应的泛型替换Stack和Queue(1)
你希望利用对应的泛型版本替换所有的Stack和Queue对象,来增强应用程序的性能并使代码更容易操作。当你发现这些数据结构中存储有结构或其他值类型时,就必须这样做,因为它们将会导致装箱/拆箱操作。
利用System.Collections.Generic.Stack和System.Collection.Generic.Queue对象替换出现的所有System.Collections.Stack和System.Collection.Queue对象。
下面给出了一个使用System.Collections.Queue对象的简单示例:
&&& public static void UseNonGenericQueue(){// Create a non-generic Queue object.Queue numericQueue = new Queue(); // Populate Queue (causing a boxing operation to occur).numericQueue.Enqueue(1);numericQueue.Enqueue(2);numericQueue.Enqueue(3); // De-populate Queue and display items (causing an unboxing // operation to occur)Console.WriteLine(numericQueue.Dequeue());Console.WriteLine(numericQueue.Dequeue());Console.WriteLine(numericQueue.Dequeue().ToString());}下面给出了使用System.Collections.Generic.Queue对象的相同代码:
&&& public static void UseGenericQueue(){// Create a generic Queue object.Queue&int& numericQueue = new Queue&int&(); // Populate Queue.numericQueue.Enqueue(1);numericQueue.Enqueue(2);numericQueue.Enqueue(3); // De-populate Queue and display items.Console.WriteLine(numericQueue.Dequeue());Console.WriteLine(numericQueue.Dequeue());Console.WriteLine(numericQueue.Dequeue());}下面给出了使用System.Collections.Stack对象的简单示例:
&&& public static void UseNonGenericStack(){// Create a non-generic Stack object.Stack numericStack = new Stack(); // Populate Stack (causing a boxing operation to occur).numericStack.Push(1);numericStack.Push(2);numericStack.Push(3); // De-populate Stack and display items (causing an unboxing // operation to occur).Console.WriteLine(numericStack.Pop().ToString());Console.WriteLine(numericStack.Pop().ToString());Console.WriteLine(numericStack.Pop().ToString());}下面给出了使用System.Collections.Generic.Stack对象的相同代码:
&& public static void UseGenericStack(){// Create a generic Stack object.Stack&int& numericStack = new Stack&int&(); // Populate Stack.numericStack.Push(1);numericStack.Push(2);numericStack.Push(3); // De-populate Stack and display items.Console.WriteLine(numericStack.Pop().ToString());Console.WriteLine(numericStack.Pop().ToString());Console.WriteLine(numericStack.Pop().ToString());}
表面上看,泛型和非泛型Queue和Stack类似乎足够相似。不过,它们在底层有着极大的区别。除了用于实例化对象的语法之外,泛型Queue和Stack对象的基本用法与其对应的非泛型对象的用法相同。泛型形式需要一个类型参数(type argument)用以创建类型。本示例中的类型参数是一个int。这个类型参数指示此Queue或Stack对象只能够包含整型以及任何可以隐式转换成整型的类型,比如short:
short s = 300;numericQueue.Enqueue(s);&&& // OK, because of the implicit conversion不过,不能隐式转换成整型的类型(比如double)将引发编译时错误:
&&& double d = 300;numericQueue.Enqueue(d);&& &// Error, no implicit conversion availablenumericQueue.Enqueue((int)d);&// OK, because of the explicit cast
非泛型形式不需要这个类型参数,因为非泛型Queue和Stack对象允许包含任何数据项作为一个元素,这是因为所有数据项都可转换成Object类型。
当在泛型和非泛型Queue或Stack之间做出选择时,需要决定你是希望使用泛型Queue或Stack对象,还是非泛型Queue或Stack对象。与非泛型形式相比,选择泛型Queue或Stack类可以提供许多好处,包括:
数据结构中包含的每个元素都被类型化为一种特定的类型。这意味着在从数据结构添加或删除对象时,无需对它们进行更多的强制转换。不能把多种完全不同的类型存储在一个数据结构内;你总是知道数据结构内存储的是什么类型。类型检查是在编译时而不是在运行时执行的。这导致编写更少的代码、获得更好的性能,以及犯更少的错误。
缩短开发时间
在不使用泛型的情况下创建类型安全的数据结构意味着必须子类化System.Collections.Queue或System.Collections.Stack类,以便创建你自己的类。这非常耗时,并且容易出错。
泛型Queue或Stack不需要强制转换,在从中添加和删除元素时,这种强制转换可能会失败。此外,在把值类型添加到Queue或Stack中时,不会发生装箱操作。同样,在几乎所有的情况下,从Queue或Stack中删除值类型时不会发生拆箱操作。
【责任编辑: TEL:(010)】&&&&&&
关于&&&&&&&&的更多文章
如果把OpenStack简单地看成一项技术,那么年龄在5年以上的技术比
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
讲师: 39人学习过讲师: 7人学习过讲师: 10人学习过
本书是企业应对不断变化的市场环境、客户期望和新技术
《计算机程序设计艺术》系列是被公认为计算机科学领域
这本高阶教程将通过大量示例帮助你精通Hadoop,掌握Ha
本书通过丰富的案例研究示例,阐明了构建面向构件软件的最重要因素:概念、技术、规范、管理以及分析与设计过程。
本书的涵盖范
51CTO旗下网站.NET中的Queue和Stack_C#应用_
.NET中的Queue和Stack
来源:人气:127
示例将介绍如何创建一个
1 using System.C//引入命名空间
2 namespace _1
class ArrayListTest
static void Main(string[] args)
ArrayList arrlist = new ArrayList();//实例化一个ArrayList对象
//使用Add方法向ArrayList中添加元素,将元素添加到ArrayList对象的末尾
arrlist.Add("苹果");
arrlist.Add("香蕉");
arrlist.Add("葡萄");
foreach (int n in new int[3] { 0, 1, 2 })
arrlist.Add(n);
//移除值为的第一个元素
arrlist.Remove(0);
//移除当前索引为的元素,即第个元素
arrlist.RemoveAt(3);
//在指定索引处添加一个元素
arrlist.Insert(1, "apple");
//遍历ArrayList,并输出所有元素
for (int i = 0; i & arrlist.C i++)
Console.WriteLine(arrlist[i].ToString());
示例将介绍如何创建一个
1 using System.C//引入命名空间
2 namespace _2
class StackTest
static void Main(string[] args)
//实例化Stack类的对象
Stack stack = new Stack();
//入栈,使用Pust方法向Stack对向中添加元素
for (int i = 1; i & 6;i++)
stack.Push(i);
Console.WriteLine("{0}入栈",i);
//返回栈顶元素
Console.WriteLine ("当前栈顶元素为:{0}",stack.Peek().ToString ());
Console.WriteLine("移除栈顶元素:{0}", stack.Pop().ToString());
//返回栈顶元素
Console.WriteLine("当前栈顶元素为:{0}", stack.Peek().ToString());
Console.WriteLine("遍历栈");
foreach (int i in stack)
Console.WriteLine(i);
while(stack .Count!=0)
int s = (int)stack.Pop();
Console.WriteLine("{0}出栈",s);
示例将介绍如何创建一个
1 using System.C//引入命名空间
2 namespace _3
class QueueTest
static void Main(string[] args)
//实例化Queue类的对象
Queue queue = new Queue();
//入栈,使用Pust方法向Stack对向中添加元素
for (int i = 1; i & 6; i++)
queue .Enqueue(i);
Console.WriteLine("{0}入队", i);
//返回队开始处的元素
Console.WriteLine("当前队开始处元素为:{0}", queue.Peek().ToString());
Console.WriteLine("遍历队");
foreach (int i in queue)
Console.WriteLine(i);
while (queue.Count != 0)
int q = (int)queue.Dequeue ();
Console.WriteLine("{0}出队", q);
示例将介绍如何创建一个
1 using System.C//引入命名空间
3 namespace _4
class HashtableTest
static void Main(string[] args)
//实例化Hashtable类的对象
Hashtable student=new Hashtable ();
//向Hashtable中添加元素
student.Add("S1001","Tom");
student.Add("S1002", "Jim");
student.Add("S1003", "Lily");
student.Add("S1004", "Lucy");
//遍历Hashtable
foreach (DictionaryEntry element in student)
string id = element.Key.ToString ();
string name = element.Value.ToString ();
Console.WriteLine("学生的ID:{0}
学生姓名:{1}",id,name);
//移除Hashtable中的元素
student.Remove("S1003");
示例将介绍如何创建一个
1 using System.C//引入命名空间
3 namespace _5
class SortedListTest
static void Main(string[] args)
//实例化SortedListTest类的对象
SortedList student = new SortedList();
//向SortedList中添加元素
student.Add("S1001", "Tom");
student.Add("S1003", "Jim");
student.Add("S1002", "Lily");
student.Add("S1004", "Lucy");
//遍历SortedList
foreach (DictionaryEntry element in student)
string id = element.Key.ToString();
string name = element.Value.ToString();
Console.WriteLine("学生的ID:{0}
学生姓名:{1}", id, name);
//移除SortedList中key为&S1003&的元素
student.Remove("S1003");
//移除SortedList中索引为&&的元素,即第一个元素
student.RemoveAt(0);
优质网站模板}

我要回帖

更多关于 stack and queue 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信