【发布时间】:2016-04-29 11:20:49
【问题描述】:
在我攻读计算机科学学士学位期间,我多次遇到递归数据结构的使用。在 C++ 中,我总是最终使用指针来使我的数据结构递归,就像我在 C 中所做的那样。
一个简化的例子如下:
struct Tree{
int data;
struct Tree *left, *right;
};
但是,使用指针往往是一项有风险的工作,并且需要花费大量时间调试和测试代码。对于这些问题,我想知道是否有任何其他有效的方法可以在 C++ 中定义递归数据结构。
在其他编程语言中,比如 Rust,我见过这样的事情:
struct Node {
children: Vec<Node>,
node_type: NodeType,
}
在 C++ 中定义这种递归结构是否有更安全和舒适的方法。一种可能是使用 std::Vector,但我不知道该方法的性能。
【问题讨论】:
-
@Robinson 这将立即结束应用程序 - 由于无限 Tree 对象创建:)
-
在某些情况下,它实际上是使用指针的一个优势,例如在树状结构中。你怎么知道一棵树没有孩子?没有可用于结构的“空”值。
-
至于为什么在 Rust 中允许,那是因为 Rust 不是 C++。两种不同的语言,无论它们的语法多么相似,都无法真正进行比较。至于 为什么 它在 Rust 中起作用可能是因为它使用 references (有点像指针)而不是实际的结构。
-
Rust 在这方面与 C++ 完全没有区别:你不能写
struct Tree { data: i32, left: Tree, right: Tree }。 Rust 的Vec内部包含方向,实际上它与 C++ 的std::vector基本相同。 (Rust 的结构和枚举是值,就像在 C++ 中一样,而不是指针/引用。) -
@zakum,如果你对在 Rust 中使用
Box/Arc/Vec感到满意,那么 C++ 中的等价物 (unique_ptr/shared_ptr/vector) 应该成为你正在寻找的东西。 (我意识到我在之前的评论中打错了:“direction”应该是“indirection”。)
标签: c++ pointers data-structures rust