3

我为一堆Node*s 编写了以下代码,这些代码可以在 module 中找到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. 我完全不知道为什么会这样。

4

1 回答 1

5

您在此运算符中做错了:

NodeArray(cast(const(Node)*)[])

您显然想要创建空的 NodeArray,但您真正得到的是带有一个 null 项的 NodeArray。NodeArray 构造函数将新数组的值列表作为参数,并传递一个“空数组”(本质上为 null),从而创建具有一个 null 元素的 NodeArray。

正确的方法是:

NodeArray()

IE:

auto make_heap() {
  return new NodeHeap();
}

进行此更改,一切都会好起来的。

ps 似乎 U 类型的多个参数的 D 表示法(U[] 值...)使您认为构造函数接受另一个数组作为初始化程序。

pps 抱歉,修复了 make_heap() 代码:不小心忘记在其中写入“NodeArray()”。并再次编辑它,因为那里不需要空的 NodeArray() 调用。双重错误!

于 2014-08-07T10:24:13.727 回答