的std ::的unique_ptr<>作为基于节点的结构中的指针

时间:2012-08-28 23:10:20

标签: c++ c++11 unique-ptr

由于大多数人都喜欢谜题,我会用一个(拼写错误:)开始这个问题。得到介绍,注意,如果你不关心它,你可以跳过热身(JG)问题)并阅读G问题,因为那是我的“真正的问题”。

  

审核潜在新员工提供的代码示例   你偶然发现了一个链接列表,其实现使用了现代的C ++ 11   feature,std :: unique_ptr<>。

template <typename T> 
struct Node { 
   T data; 
   std::unique_ptr<Node<T>> next; 
   Node () {} 
   Node(const T& data_): data(data_) {} 
   Node(Node& other) { std::static_assert(false,"OH NOES"); } 
   Node& operator= (const Node& other) { 
     std::static_assert(false,"OH NOES"); 
     return *new Node(); 
   } 
public: 
   void addNext(const T& t) { 
      next.reset(new Node<T>(t)); 
   }
};

template<typename T>
class FwdList
{
    std::unique_ptr<Node<T>> head;
public:
    void add(const T& t)
    {
        if (head == nullptr)
            head.reset( new Node<T>(t));
        else {
            Node<T>* curr_node = head.get();
            while (curr_node->next!=nullptr) {
                curr_node = curr_node->next.get();
            }
            curr_node->addNext(t);
        }
    }
    void clear() {
        head.reset(); 
    }
 };

JG问题:

  

使用此确定(忽略缺少的功能)问题   代码。

G问题:(根据答案添加2.)
1。

  

有没有办法解决在JG部分检测到的问题   没有使用原始指针的问题?

2

  

修复是否适用于节点包含多个指针的容器(例如,二叉树具有指向左右子节点的指针)

数目:
JG:

  

stackoverflow :)。原因:unique_ptr&lt;&gt;的递归析构函数   由.clear()函数触发。

G:

  

(???)我不知道,我的直觉不是,但我想查一下   专家们。

这么长的故事:有没有办法在基于节点的结构中使用智能指针而不是最终出现SO问题?请不要说树木可能不会太深,或类似的东西,我正在寻找一般的解决方案。

1 个答案:

答案 0 :(得分:7)

您可以迭代清除它,确保每个节点的next指针在销毁节点之前为空:

while (head) {
    head = std::move(head->next);
}

二叉树比较棘手;但你可以通过迭代地切断右手分支并将它们添加到左下角来将其展平成一个列表,如下所示:

node * find_bottom_left(node * head) {
    while (head && head->left) {
        head = head->left.get();
    }
    return head;
}

node * bottom = find_bottom_left(head.get());

while (head) {
    bottom->left = std::move(head->right);
    bottom = find_bottom_left(bottom);
    head = std::move(head->left);
}