如何在Google go中编写可重用优先级队列的代码,或者每次需要优先级队列实现时都需要定义Less、Push和Pop函数?
发布于 2012-12-07 01:10:16
后一种情况是我们必须要做的。就Go没有泛型而言,它是目前唯一可用的选择。
发布于 2012-12-07 06:34:08
我还没有尝试过,但是如果你的案例碰巧符合某些限制,也许你可以使用反射和结构标签。您将要求您的可堆类型是一个结构,在用于排序的字段上具有类似于pq:"Key"的标记,并且该字段类型是<可比较的。它远不如less方法强大,但它可能满足您的需求。
对不起,我没有给你的示例代码。我认为这不会很难,但这需要我花一些时间。离开去做练习了。
如果我有需要处理任意结构的情况,并且我可以忍受简单的键限制,我可能会尝试这种技术。但是,对于有限的类型集,我不会这么做。我会照本宣科,为每种类型分别实现heap.Interface。这真的不是那么多的工作,也不是那么多的代码。
发布于 2012-12-07 04:07:05
过去,标准库的container/vector模块中有一些矢量类型,它们基于可调整大小的切片实现了这些方法,并完美地充当了与heap模块一起使用的容器。不幸的是,他们抛弃了vector,我从来没有理解过它,因为它在切片变量上实现了一个很好的方法级抽象。所以现在,每当我看到有人在Go中使用堆模块时,他们基本上必须重新实现vector的一部分--基于切片变量编写Push、Pop、Length等。
https://stackoverflow.com/questions/13748826
复制相似问题