【发布时间】:2020-12-23 15:17:44
【问题描述】:
我正在用 C++ 编写一个斐波那契堆数据结构 (https://en.wikipedia.org/wiki/Fibonacci_heap)。 这个数据结构由几个堆组成,根连接在一个双向链表中。每个节点都有一个其子节点的双向链表。整个堆有一个叶子节点的双向链表,以支持快速修剪。 (CLRS 19-3.b)
我对@987654322@ 的实现是:
struct Node {
using Iterator = std::list<std::unique_ptr<Node>>::iterator;
using LeafIterator = std::list<std::reference_wrapper<std::unique_ptr<Node>>>::iterator;
Iterator parent;
std::list<std::unique_ptr<Node>> child_list;
T key;
bool mark = false;
bool is_leaf = false;
LeafIterator leaf_iterator;
Node(const T& key) : key {key} {}
};
我对@987654324@ 的实现是:
using Iterator = std::list<std::unique_ptr<Node>>::iterator;
using LeafIterator = std::list<std::reference_wrapper<std::unique_ptr<Node>>>::iterator;
std::list<std::unique_ptr<Node>> NIL;
std::list<std::unique_ptr<Node>> root_list;
std::list<std::reference_wrapper<std::unique_ptr<Node>>> leaf_list;
Iterator min_element;
我用std::list<std::reference_wrapper<std::unique_ptr<Node>>>代替leaf_list,而不是std::list<Node*>,因为叶子节点的内存完全归其父节点所有,我不希望双重删除崩溃。
当我尝试删除叶节点时出现问题。我可以通过leaf_list.begin() 访问要删除的叶节点,但无法从其父节点的child_list 中删除它。
我认为有两种可能的解决方法:
- 从
parent的child_list执行线性扫描以获得与给定叶子匹配的std::list<std::unique_ptr<Node>>::iterator。这是线性扫描,太慢了。 - 抛弃
leaf_list并保留两个指针作为Node的成员变量,其中包含prev_leaf和next_leaf以模拟双向链表。我不喜欢这样,因为它会使Nodes 更加臃肿。 - ...暂时想不到别的了
在这种情况下,从std::reference_wrapper 获取std::list<std::unique_ptr<Node>>::iterator 的最佳方法是什么?
【问题讨论】:
标签: c++ linked-list iterator