不使用指针的递归数据结构

时间:2016-04-29 11:20:49

标签: c++ pointers data-structures rust

在CS学士学位期间,我经常遇到递归数据结构的使用。在C ++中,我总是最终使用指针来使我的数据结构递归,就像我在C中所做的那样。

简化示例如下:

struct Tree{
    int data;
    struct Tree *left, *right;
};

但是,使用指针往往是一项危险的工作,需要花费很多时间来调试和测试代码。对于这些资源,我想知道是否有其他有效的方法在C ++中定义递归数据结构。

在其他编程语言中,比如Rust,我已经看过类似的东西:

struct Node {
    children: Vec<Node>,
    node_type: NodeType,
}

在C ++中是否有一种更安全,更舒适的方法来定义这种递归结构。一种可能性是使用std :: Vector,但我不知道该方法的性能。

2 个答案:

答案 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的一个很好的用例)。