如何使用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
例程,该例程返回最小数据(留下大多数节点的数据(,给定树的根。目前,我已经递归实施。
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;
}
}
您有:函数,错误和所有功能的迭代版本。
我们可以利用唯一_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();
}
}
我们只需获取内容并使用原始的基础指针,而不是在智能指针包装纸的顶部操作。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 迭代时从向量和内存中删除对象
- 如何在c++迭代器类型中包装std::chrono
- 带过滤器的现代迭代c++集合
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- C++矢量迭代
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 擦除while循环中迭代的元素
- 实现一个在集合上迭代的模板函数
- 对于set上的循环-获取next元素迭代器
- 在向量内的向量上迭代
- 为什么output_editor Concept不需要output_e迭代器标记
- TSP递归解的迭代形式
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器