更具体地说,我想知道为什么我们在典型的链表实现中使用指针。以下节点的实现可能会导致任何问题吗?
template <typename T>
class Node {
T data;
Node<T>& next;
Node<T>& prev;
};
有什么理由我们应该在这里使用指针而不是引用吗?
更具体地说,我想知道为什么我们在典型的链表实现中使用指针。以下节点的实现可能会导致任何问题吗?
template <typename T>
class Node {
T data;
Node<T>& next;
Node<T>& prev;
};
有什么理由我们应该在这里使用指针而不是引用吗?
创建引用后不能设置引用,这使得非可变链表实现有些棘手。(您需要将引用包装在要更改引用时可以重新创建的对象中)。
也无法在引用上设置 NULL 值,因此表示列表的结尾需要一些想象力。
可能更好地坚持链接列表中的指针,甚至更好,使用std::list<>
.
左值引用不能替换指针;他们做不同的事情。
左值引用必须用左值初始化,并且左值引用将在其生命周期的剩余时间内引用该对象。不能反弹。这为您的列表节点带来了两个直接问题。
你如何开始列表?您想构造一个没有“先前”的节点,但prev
必须使用Node
对象初始化该成员。您可以想象使用who is it self 来表示列表Node
的prev
头部,但这解决了左值引用的糟糕选择。(例如Node<T> emptylist = { T(), emptylist, emptylist }; //eurgh
)
其次,你如何操作列表?您无法更改 的绑定,next
这prev
意味着更改列表的唯一方法是构建一组全新的节点并复制每个data
元素。