引用可以替换指针吗?

时间:2012-09-14 22:39:09

标签: c++ linked-list

更具体地说,我想知道为什么我们在典型的链表实现中使用指针。以下节点实现可能会导致任何问题吗?

template <typename T>
class Node {
    T data;
    Node<T>& next;
    Node<T>& prev;
};

我们应该在这里使用指针代替引用吗?

2 个答案:

答案 0 :(得分:4)

创建引用后无法设置引用,这使得不可变的链表实现有点棘手。 (当您想要更改引用时,您需要将引用包装在可以重新创建的对象中。)

也无法在引用上设置NULL值,因此表示列表的末尾需要一些想象力。

可能更好地坚持链表中的指针,甚至更好,使用std::list<>

答案 1 :(得分:1)

Lvalue引用不能替换指针;他们做了不同的事情。

左值引用必须用左值初始化,左值引用将在其余部分的生命周期内引用该对象。它无法反弹。这为您的列表节点提出了两个直接问题。

如何开始列表?您想构建一个没有&#34;之前&#34;的节点。但必须使用prev对象初始化Node成员。你可以想象使用一个Node prev是自己代表列表的头部,但这是在解决左值参考的糟糕选择。 (例如Node<T> emptylist = { T(), emptylist, emptylist }; //eurgh

其次,你如何操纵清单?您无法更改nextprev的绑定,这意味着更改列表的唯一方法是构建一组全新的节点并复制每个data元素