【问题标题】:How to use unique_ptr for iteration?如何使用 unique_ptr 进行迭代?
【发布时间】:2019-09-24 17:52:13
【问题描述】:

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

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-&gt;left,但是这样的赋值对于unique_ptr是行不通的。

有没有办法迭代地实现它?

【问题讨论】:

  • unique_ptr 转让所有权。您仍然可以拥有指向节点的本机指针以进行迭代:_findmin(const node* curr) 而不是 _findmin(std::unique_ptr)。使用 unique_ptr::get() 获得非拥有指针。

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


【解决方案1】:

当前函数的问题在于它需要一个引用。我们无法直接将其转换为循环,因为您无法重新安装引用(= 使其指向其他地方)。

但是,我们可以用指针来做到这一点!我们只需要在每次使用时添加*

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();
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多