如何使用unique_ptr进行迭代?
How to use unique_ptr for iteration?
我有一个二叉搜索树实现,其中树的每个节点都具有此结构。
struct node {
T data;
std::unique_ptr<node> left, right;
node(T data): data(data), left(nullptr), right(nullptr) {}
};
我已经实现了一个 findmin
例程,该例程 returns 给定树的根节点的最小数据(最左边节点的数据)。目前我已经递归实现了
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.
是行不通的
有没有迭代实现的方法?
您当前函数的问题在于它需要引用。我们无法直接将其转换为循环,因为您无法重新设置引用(= 使其指向其他地方)。
但是,我们可以用一个指针来完成!我们只需要在每次使用它时添加*
。
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();
}
}
我们不是在智能指针包装器之上操作,而是简单地获取内容并使用原始底层指针。
我有一个二叉搜索树实现,其中树的每个节点都具有此结构。
struct node {
T data;
std::unique_ptr<node> left, right;
node(T data): data(data), left(nullptr), right(nullptr) {}
};
我已经实现了一个 findmin
例程,该例程 returns 给定树的根节点的最小数据(最左边节点的数据)。目前我已经递归实现了
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.
有没有迭代实现的方法?
您当前函数的问题在于它需要引用。我们无法直接将其转换为循环,因为您无法重新设置引用(= 使其指向其他地方)。
但是,我们可以用一个指针来完成!我们只需要在每次使用它时添加*
。
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();
}
}
我们不是在智能指针包装器之上操作,而是简单地获取内容并使用原始底层指针。