链接-C+中使用引用而不是指针的列表

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (28)

假设我想要创建一个不可修改的链接列表(也就是说,它只能被遍历,一旦最初创建了它,就不能添加或删除任何节点)。这可以很容易地通过以下方式实现:

struct ListNode
{
  int value;
  ListNode* nextNode;
}

是否可以使用引用而不是指针?

struct ListNodeWithRefs
{
  int value;
  ListNodeWithRefs &nextNode;
}

我不确定它能带来什么性能上的提高,但是.在编码时出现了这个问题,我的答案是但我可能遗漏了什么。

原则上,没有什么可以阻止您使用引用,并构造如下列表:

ListNodeWithRefs::ListNodeWithRefs(ListNodeWithRefs &next):
  nextNode(next)
{}

但这里有鸡和蛋的问题,因为next也强制执行next元素在它的创建时存在,等等。

注:我认为我的问题也可适用于将清单界定为:

struct ListNodeConst
{
  int value;
  const ListNode* nextNode;
}
提问于
用户回答回答于
// Beware, un-compiled code ahead!
template< typename T >
struct node;

template< typename T >
struct links {
  node<T>& prev;
  node<T>& next;
  link(node<T>* prv, node<T>* nxt); // omitted
};

template< typename T >
struct node {
  T data;
  links<T> linked_nodes;
  node(const T& d, node* prv, node* nxt); // omitted
};

// technically, this causes UB...
template< typename T >
void my_list<T>::link_nodes(node<T>* prev, node<T>* next)
{
  node<T>* prev_prev = prev.linked_nodes.prev;
  node<T>* next_next = next.linked_nodes.next;
  prev.linked_nodes.~links<T>();
  new (prev.linked_nodes) links<T>(prev_prev, next);
  next.linked_nodes.~links<T>();
  new (next.linked_nodes) links<T>(next, next_next);
}

template< typename T >
void my_list<T>::insert(node<T>* at, const T& data)
{
  node<T>* prev = at;
  node<T>* next = at.linked_nodes.next;
  node<T>* new_node = new node<T>(data, prev, next);

  link_nodes(prev, new_node);
  link_nodes(new_node, next);
}
用户回答回答于

否理由:

  1. 如果nextNode是引用,则不能插入节点。
  2. 如果这是列表尾,那么nextNode应该指什么?

所属标签

可能回答问题的人

  • 西风

    renzha.net · 站长 (已认证)

    7 粉丝1 提问12 回答
  • 四无君

    0 粉丝0 提问3 回答
  • HKC

    红客学院 · 创始人 (已认证)

    26 粉丝7 提问2 回答
  • o o

    1 粉丝490 提问2 回答

扫码关注云+社区

领取腾讯云代金券