提问人:mpv 提问时间:9/15/2022 更新时间:9/15/2022 访问量:77
针对红黑树的 const_iterator& operator++() 错误
bugged const_iterator& operator++() for red-black tree
问:
我是 c++ 的新手,我在模板类 Tree 上实现迭代器时遇到了一些问题(代码结构包括规范类(Node、Tree、Iterator)。
Fwd 迭代器在主要测试(使用以下摘录)时无法正常工作:
//expected result: 16 | 20 | 61 | 65 | 71 | 76 | 81 | 85 | 90 | 93 | 101 |
auto it{rbt.begin()};
auto end{rbt.end()};
std::cout << *it << std::endl; // works fine=16
std::cout << *end // works fine = set to nullptr, returns 0
while(it!=end) {
std::cout << *it << std::endl;
it++;
}
//getting alternatively the following errors when trying different solutions:
//A- just |16| and then iterator stops
//B- overflowing with |16|16|16|16|16|16|16|16|16|16|16 never stopping
//C- overflowing with |16|0|16|0|16|0|16|0|16|0|16|0|16 never stopping
//D- segmentation fault core (dump)
我想这是由于树的创建方式,特别是将一些帮助程序“NIL”(指向已初始化但空节点的指针)存活在内存中的事实。 它们对于其他 Tree 方法(如插入/删除)是必需的,但据我所知,它们会干扰迭代器的正确功能,而不是简单地跳过它们,而是卡在某个地方。 我尝试自己更改运算符++()的主要条件: 从
if(current_node->right!=nullptr)
自
if(current_node->right!=NIL)
在迭代器类中,但我收到“无效使用非静态数据成员'RBTree::NIL'”错误,我不知道该怎么做才能修复它,让 Tree 的 NIL 私有成员在迭代器中也可见。 以下是有关类的更多详细信息以及包含完整代码的链接:
template <class T, class CMP>>
class Tree {
public:
typedef T node_type;
typedef _Node<node_type> Node; ///< type of template tree node.
typedef Node *NodePtr; ///< type of pointer to template tree node.
class const_iterator;
private:
NodePtr root;
NodePtr NIL; ///< empty node, probable cause of the problem
摘自 Iterator 类:
template <class T, class CMP>
class RBTree<T, CMP>::const_iterator {
friend class RBTree;
private:
NodePtr current_node;
public:
const_iterator& operator++() { // this is the method causing issues
if(current_node->right!=nullptr) {
current_node = current_node->right->leftmost();
}
else {
current_node = current_node->rightmost();
}
return *this;
}
最后是 Node 类:
template <class T>
class _Node {
public:
friend class const_iterator; //allows const_iterator using leftmost() and rightmost()
T data; //key
Color color; //color
_Node *left, *right, *parent; ///< pointers to parent, left and right children.
//Default Constructor of a RBTree's node.
_Node() {}
_Node(T key, Color clr=BLACK, _Node *parent=nullptr) : data{key}, color{clr}, left{nullptr}, right{nullptr}, parent{parent} {}
~_Node() noexcept {}
_Node* leftmost() noexcept {
if(left!=nullptr) {
return left->leftmost();
}
return this;
}
_Node* rightmost() const {
if(parent!=nullptr) {
if(parent->right==this) {
return parent->rightmost();
}
}
return parent;
}
如果您想帮助我理解和改进我的代码,请提前感谢您:我知道周围可能还有很多其他错误,所以请提供任何建议,这是我提高技能的一种方式。
答: 暂无答案
评论