我已经为一堆 Node*
编写了以下代码,这些代码可以在 node
模块中找到:
import std.exception, std.container;
public import node;
alias NodeArray = Array!(const (Node)*);
alias NodeHeap = BinaryHeap!(NodeArray, cmp_node_ptr);
auto make_heap() {
return new NodeHeap(NodeArray(cast(const(Node)*)[]));
}
void insert(NodeHeap* heap, in Node* u) {
enforce(heap && u);
heap.insert(u);
}
pure bool cmp_node_ptr(in Node* a, in Node* b) {
enforce(a && b);
return (a.val > b.val);
}
然后我尝试对其运行以下单元测试,其中
make_leaf
返回一个使用给定参数初始化的 Node*
:unittest {
auto u = make_leaf(10);
auto heap = make_heap();
insert(heap, u); //bad things happen here
assert(heap.front == u);
auto v = make_leaf(20);
insert(heap, v);
assert(heap.front == u); //assures heap property
}
测试进入我注释标记的行,然后在
enforce(a && b)
中的 cmp_node_ptr
行抛出一个强制错误。我完全不知道为什么会这样。 最佳答案
你在这个运营商做错了:
NodeArray(cast(const(Node)*)[])
您显然想创建空的 NodeArray,但是 真正得到 的是带有一个空项的 NodeArray。 NodeArray 构造函数将新数组的值列表作为参数,并传递一个“空数组”(本质上为 null),从而创建具有一个 null 元素的 NodeArray。
正确的方法是:
NodeArray()
IE。:
auto make_heap() {
return new NodeHeap();
}
进行此更改,一切都会好起来的。
附言似乎 U 类型的多个参数的 D 表示法(U[] 值...)让您认为构造函数接受另一个数组作为初始值设定项。
pps抱歉,修复了 make_heap() 代码:不小心忘记在其中写入“NodeArray()”。并再次编辑它,因为那里不需要空的 NodeArray() 调用。双重错误!
关于pointers - D:来自 std.container.BinaryHeap 的奇怪行为,带有用于比较的自定义函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25177555/