在CS学士学位期间,我经常遇到递归数据结构的使用。在C ++中,我总是最终使用指针来使我的数据结构递归,就像我在C中所做的那样。
简化示例如下:
struct Tree{
int data;
struct Tree *left, *right;
};
但是,使用指针往往是一项危险的工作,需要花费很多时间来调试和测试代码。对于这些资源,我想知道是否有其他有效的方法在C ++中定义递归数据结构。
在其他编程语言中,比如Rust,我已经看过类似的东西:
struct Node {
children: Vec<Node>,
node_type: NodeType,
}
在C ++中是否有一种更安全,更舒适的方法来定义这种递归结构。一种可能性是使用std :: Vector,但我不知道该方法的性能。
答案 0 :(得分:2)
使用指针而不是值的原因是因为您永远无法定义struct
,因为它的大小将无限递归。
struct Tree{
int data;
struct Tree left, right;
};
忽略填充等,您可以将Tree
的大小近似为
sizeof(Tree) == sizeof(int) + sizeof(Tree) + sizeof(Tree)
// ^data ^left ^right
但是您可以看到,Tree
有两个Tree
成员,而这些成员本身有两个Tree
成员,而且有两个Tree
成员......你可以看到它的发展方向。
答案 1 :(得分:2)
Rust示例使用子项向量 - 也可以为空。
在C ++中,成员变量可以是对象,指针或引用(为简单起见,省略)。
由于节点对象不能直接使用(这会无限循环)并且您不希望使用指针,因此您的选项是:
也使用向量(虽然对于二叉树来说这不是最方便的类型 - 但是你可以在代码中将其限制为总是两个元素),
使用地图(键可以是枚举CHILD_LEFT,CHILD_RIGHT),
重新考虑使用指针,或者更好的是:智能指针(这看起来像常规unique_ptrs
的一个很好的用例)。