问题描述
当我要初始化一棵红黑树时,请按照文档中的说明进行操作。
auto rbt = redBlackTree(1,2,3,4)
但是,如果我想在全局范围内声明它或制作一个红黑树数组,我不知道该怎么做,文档也无济于事。我尝试过各种方法,但经常会遇到类似以下错误:redBlackTree!int is used as a type
您可以帮我吗?如果我知道要放什么而不是auto
,即知道redBlackTree
的类型,那我就可以做到。
我想在全局范围内声明一棵红黑树或声明一个我需要为其声明类型的数组,我想这样做:
type rbt;
void main() {
rbt.insert(3);
}
或者这个:
void main{
type[2] rbt;
rbt[0].insert(1);
}
解决方法
您不需要知道redBlackTree
的类型。您可以在编译时使用typeof
进行查询:
alias RBTree = typeof(redBlackTree(1));
RBTree rbt = redBlackTree(1,2,3);
这是一种常见且受鼓励的模式,因为D中的许多函数都返回Voldemort types(无法命名的类型)。
在您的示例中,类型为RedBlackTree!int
。如果您不使用IDE,发现类型的简单方法是pragma(msg,typeof(<functionCall>(<args>)));
。
此外,我应该注意到,声明RedBlackTree数组可用于auto
:
auto arr = [redBlackTree(1,2),redBlackTree(3,4)];
要获得更多帮助,请随时发布失败的确切代码。
,类型(使用long代替int)为RedBlackTree!long
,下面是一些示例。请记住,您必须使用new
来初始化类。
import std.stdio;
import std.container;
RedBlackTree!long rbtree;
RedBlackTree!long[2] rbarray;
RedBlackTree!long[] rbdynamicarr;
RedBlackTree!long[][] rbmat;
void main() {
rbtree.writeln;
rbtree = new RedBlackTree!long;
rbtree.insert(3);
rbtree.writeln;
rbarray.writeln;
rbarray = new RedBlackTree!long[2];
rbarray.writeln;
rbdynamicarr.writeln;
int n = 3;
rbdynamicarr = new RedBlackTree!long[n];
rbdynamicarr.writeln;
rbmat.writeln;
int m = 2;
rbmat = new RedBlackTree!long[][](n,m);
rbmat.writeln;
alias RBTree = typeof(redBlackTree!long(1L));
RBTree rbalias;
rbalias = new RBTree;
rbalias.writeln;
RBTree[3] crayola;
crayola.writeln;
typeid(redBlackTree(1)).writeln;
RedBlackTree!(long,"a < b",false) hola;
hola = new RedBlackTree!(long,false);
hola.writeln;
}