2

我最终决定使用std.RedBlackTree而不是内置的关联数组(或哈希),因为我需要一个排序的关联数组。所需的行为与 C++/STL 中的行为非常相似std::map

void main() {

  alias Tuple!(float, float) Pair;
  alias RedBlackTree!Pair Map;
  Map m1;
  m1.insert(Pair(1.1, 2.2));
}

上面的代码,取决于你如何编译它(带或不带-release),会导致分段错误或抛出断言。

与此相同:

void main() {

  struct Pair { float first, second; }
  alias RedBlackTree!(Pair, "a.first < b.first") Map;
  Map m1;
  m1.insert(Pair(1.1, 2.2));
}

闻起来像一个错误,但有解决方法吗?

4

2 回答 2

8

RedBlackTree 是一个类,因此必须初始化。m1 默认为空。您所看到的相当于 Java 中的 NullPointerException。

试试这个:

import std.stdio, std.container;
void main() {
  struct Pair { float first, second; }
  alias RedBlackTree!(Pair, "a.first < b.second") Map;
  Map m1 = new Map;
  m1.insert(Pair(1.1, 2.2));
}

另外,作为这个编程示例的一个提示:您可能需要考虑RedBlackTree!(Pair, "a.first < b.first")。原因是它会有一些奇怪的(不是完全未定义,但可能不是你想要的)行为。

例如,Pair(1, 2) < Pair(1, 3)会是真的。奇怪的是,Pair(1, 3) < Pair(1, 2)这也是真的。

于 2012-04-14T22:30:08.827 回答
3

我要指出的是,当您遇到段错误时,您通常应该寻找的前两件事是空指针/引用和无限递归。您可以使用调试器来确定它们发生的确切位置。

RedBlackTree是一个类,因此任何为 a 的变量都是RedBlackTree引用类型。因此,您必须为它分配一个除 之外的值null,否则它将是null,并且当您尝试使用它时会出现段错误。如果您有一个指向某物的变量,并且您尝试使用它而不为其分配非空值,则会发生完全相同的事情。

您的初始化行应该是

Map m1 = new Map;

或者,使用RedBlackTree,你可以做

Map m1 = redBlackTree!"a.first < b.first"(Pair(1.1, 2.2));

redBlackTreeRedBlackTree是一个辅助函数,用于在一行中创建和插入元素。

于 2012-04-15T00:57:09.023 回答