2017-10-05 61 views
1

许多语言都有队列类型(http://docs.oracle.com/javase/7/docs/api/java/util/Queue.html);我甚至找不到实现队列类型的库(先进先出数据结构)。缺少排队令我感到惊讶。 D有排队的方式吗?D中的队列类型?

我希望会是类似这样的语法:

//To create 
Queue!string queue = new Queue!string; 

//To add 
queue.add("value"); 

//To access 
string value = queue.get; //will remove from queue 
//or 
foreach (string value; queue) {} 

这将如何保存在d做了什么?或者我需要自己实施它吗?

回答

2

当前位于D标准库中的容器位于std.container中。虽然它们有点稀疏。他们正在进行重新设计,但现在已经有一段时间了,谁知道什么时候会完成。所以,不幸的是,D的标准库在容器领域有点弱。话虽如此,你可以使用std.container.dlist.DList作为队列。这是一个双向链接列表,通常是如何在内部实现队列,即使这不是他们公开的API。

或者,http://code.dlang.org有几个容器包。

但我建议从DList开始,看看它的工作效果如何,你需要什么。如果你正在寻找一个基本的队列,它应该工作得很好。只需使用insertBack即可完成任务,front可获得第一个元素,removeFront可从前面删除物品。如果你想要一个强制队列的API,你可以用你自己的类型包装一个DList

+1

你也可以用一个简单的数组来完成它。你甚至可以用数组和辅助方法高效地完成它;少于20行的代码。 –

+0

这就是我需要的。我以前找不到图书馆,但我想我不确定图书馆可能会被称为什么。 @ AdamD.Ruppe是的,虽然我可能不得不这样做,但我确信有更少的内存重新分配会有更好的方式。我从来不知道如何实现低级别的队列。双链表! (https://en.wikipedia.org/wiki/Doubly_linked_list) –

+0

我这样做的方式是一个圆形数组(甚至可能是静态大小)。像'ubyte开始,结束; T [256]队列; void add_to_queue(T t){queue [end ++] = t; } T remove_from_queue(){return queue [start ++]; }'你可能会想要清理那些粗糙的边缘(比如可能检查start == end,它是空的),但是这些代码实际上对很多事情来说都很好,非常简单,并且没有内存重新分配。 –