【问题标题】:Queue type in D?D中的队列类型?
【发布时间】:2017-10-05 23:52:24
【问题描述】:

许多语言都有队列类型 (http://docs.oracle.com/javase/7/docs/api/java/util/Queue.html);我什至找不到实现队列类型(先进先出数据结构)的库。没有排队让我感到惊讶。 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 中完成?还是我需要自己实现?

【问题讨论】:

    标签: queue message-queue d


    【解决方案1】:

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

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

    但我建议从DList 开始,看看它在满足您的需要时效果如何。如果您正在寻找基本队列,它应该可以正常工作。只需使用insertBack 将内容放在最后,front 获取第一个元素,并使用removeFront 从前面删除项目。如果您想要一个强制队列的 API,您可以将 DList 包装成您自己的类型。

    【讨论】:

    • 你也可以用一个简单的数组很简单地做到这一点。您甚至可以使用数组和几个辅助方法有效地做到这一点;不到 20 行代码。
    • 这正是我所需要的。我以前找不到图书馆,但我想我不确定该图书馆可能被称为什么。 @AdamD.Ruppe 是的,虽然我可能不得不这样做,但我确信会有更好的方法来减少内存重新分配。我从来不知道低级别的队列是如何实现的。双向链表! (en.wikipedia.org/wiki/Doubly_linked_list)
    • 我这样做的方式是一个圆形数组(甚至可能是静态大小)。就像ubyte start, end; T[256] queue; void add_to_queue(T t) { queue[end++] = t; } T remove_from_queue() { return queue[start++]; } 你会很想清理那里的一些粗糙边缘(比如检查是否 start == end,它是空的),但该代码实际上可以很好地处理很多事情,真的很简单,而且根本没有内存重新分配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多