据我了解, aunique_ptr
表示专有所有权。一个单链表似乎适合这个,每个节点都拥有下一个,比如(pseduocode alert)
class node{
public:
unique_ptr<node> next;
int value;
};
但我不明白如何执行诸如遍历列表之类的操作,这是我习惯做的
here=here->next;
如何使用unique_ptr
's 实现数据结构?它们是适合这项工作的工具吗?
据我了解, aunique_ptr
表示专有所有权。一个单链表似乎适合这个,每个节点都拥有下一个,比如(pseduocode alert)
class node{
public:
unique_ptr<node> next;
int value;
};
但我不明白如何执行诸如遍历列表之类的操作,这是我习惯做的
here=here->next;
如何使用unique_ptr
's 实现数据结构?它们是适合这项工作的工具吗?
当您遍历节点时,您不需要拥有节点指针,这意味着
这里=这里->下一个;
如果这里是 unique_ptr,则不正确。拥有一个对象意味着“对它的生死负责”,这意味着所有者是拥有销毁该对象的代码的人。如果您使用另一种拥有的定义,那么这不是 unique_ptr 的意思。
在您的列表节点代码中,您假设每个节点负责下一个节点(如果您销毁一个节点,所有下一个节点也将被销毁)。它可以是有效的行为,这取决于您的需求,只要确保它是您真正想要的。
你想要的是在不拥有它的情况下读取指针。当前的最佳做法是使用原始指针,向查看此代码的其他开发人员指示“使用但不拥有”的使用方式(unique_ptr 的意思是“如果我死了,指向的对象也死了”):
node* here = nullptr; // it will not own the pointed nodes (don't call delete with this pointer)
here = &first_node(); // assuming first_node() returns a reference to the first node
here = here->next.get(); // to get the next node without owning it: use get() - true in all smart pointers interface