如何使用unique_ptr进行迭代?

时间:2019-05-07 05:54:05

标签: c++ c++11 smart-pointers

我有一个二叉搜索树实现,其中树的每个节点都具有这种结构。

struct node {
        T data;
        std::unique_ptr<node> left, right;
        node(T data): data(data), left(nullptr), right(nullptr) {}
    };

我已经实现了一个findmin例程,该例程返回给定树的根的最小数据(最左边节点的数据)。目前,我已经递归实现了。

template<typename T>
T Btree<T>::_findmin(std::unique_ptr<node>& curr)
{
    if (curr && curr->left == nullptr)
        return curr->data;
    return _findmin(curr->left);    
}

这可行,但是我想迭代地实现。对于普通的指针,我们可以分配然后继续遍历最左边的节点curr = curr->left,但是这样的分配不适用于unique_ptr。

是否有一种迭代实现的方法?

1 个答案:

答案 0 :(得分:6)

您当前功能的问题是它需要一个参考。我们无法将其直接转换为循环,因为您无法重置引用(=将其指向其他位置)。

但是,我们可以使用指针!每次使用时,我们只需要添加*

template<typename T>
T Btree<T>::_findmin(std::unique_ptr<node> &root)
{
    std::unique_ptr<node> *curr = &root;
    while (true) {
        if (*curr && (*curr)->left == nullptr)
            return (*curr)->data;
        curr = &(*curr)->left;
    }
}

就可以了:函数,错误和所有内容的迭代版本。

我们可以利用unique_ptr的一种方法get()来消除一种间接性:

template<typename T>
T Btree<T>::_findmin(std::unique_ptr<node> &root)
{
    node *curr = root.get();
    while (true) {
        if (curr && curr->left == nullptr)
            return curr->data;
        curr = curr->left.get();
    }
}

我们没有在智能指针包装器上进行操作,而是简单地获取内容并使用原始的基础指针。