为什么std.RedBlackTree作为地图中断了?

Arl*_*len 2 d

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

void main() {

  alias Tuple!(float, float) Pair;
  alias RedBlackTree!Pair Map;
  Map m1;
  m1.insert(Pair(1.1, 2.2));
}
Run Code Online (Sandbox Code Playgroud)

上面的代码,取决于你如何编译它(有或没有-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));
}
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ain 8

RedBlackTree是一个类,因此必须初始化.m1默认为null.您所看到的相当于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));
}
Run Code Online (Sandbox Code Playgroud)

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

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