我最终决定使用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,但有一个解决方法吗?
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)也是如此.