2

我意识到我很愚蠢,所以请对我放轻松。是的,这是一项任务,但我想了解我做错了什么,而不仅仅是答案。

我正在尝试为 BSTIterator 类模板中的二叉搜索树上的迭代器编写一个 operator== 和一个 operator!= 函数。

给定(都在同一个类模板中):

private: 

BSTNode<Data>* curr;

...

bool operator==(BSTIterator<Data> const & other) const {
  (here's where I do my magic)
}

操作员的设置相同!=。

我为 == ...

  return (&curr == other);

我认为我不需要括号,但无论如何......这就是我所拥有的!=

  return !(&curr == other);

我的编译器有问题!= 但显然不是 ==。

它吐出了很多狼吞虎咽的东西,但据我所知,相关部分是:

'&((const BSTIterator*)this)->BSTIterator::curr != other' 中的 'operator!=' 不匹配

它引用了上面写着的那一行return !(&curr == other);

我认为起初编译器也不喜欢我的 operator== 函数,但我现在看不到对它的引用。为什么除了 之外它们基本相同时,它会喜欢一个而不是另一个!

如果我需要包含更多信息,请告诉我。

4

2 回答 2

4

正如我从您的代码中了解到的curr那样,表明您的迭代器指向它的位置。当您将迭代器的实例与另一个实例进行比较时,您应该检查它们是否都指向同一位置。我对吗?如果答案是真的,你不应该这样编码:

bool operator==( BSTIterator<Data> const & other) const {
    return this->curr == other.curr;
}
bool operator!=( BSTIterator<Data> const & other) const {
    return this->curr != other.curr;
}

关于你的错误:你的编译器说&cur是一个 type( BSTNode<Data>**),我不知道如何将它与你的 iterator( BSTIterator<Data>) 的实例进行比较,这很明显,因为你正在为你的类定义==and!=并且你从未定义过 and 运算符 for这样的操作,你呢?

于 2012-10-09T19:11:20.603 回答
1

首先要确定操作的语义是什么。对于具有引用语义的类(迭代器表示对容器中元素的引用),相等的常见定义是指完全相同的对象。从概念上讲,it1 == it2iff &*it1 == &*it2(如果访问的对象的地址相同,则两个迭代器都是operator*相同的*)。

之后,您只需要执行测试。在您的情况下,如果您有一个指向树中节点的指针,那么如果存储在迭代器内的指针引用同一个节点,那么这两个迭代器是相同的。也就是说,如果存储的指针相同。

请注意,在这种情况下,您要按值比较指针:如果两个指针中存储的值相同,则它们是相同的,因此您将使用地址运算符 (1):

return (&curr == other);
        ^        ^
        1        2

另请注意 (2) 在那行代码中,您将指针与可能没有意义curr的迭代器进行比较。other您想比较两个存储的指针。

于 2012-10-09T19:12:09.527 回答