在C ++中为迭代器编写operator ==函数

时间:2012-10-09 19:01:49

标签: c++ debugging iterator

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

我正在尝试在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);

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

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

  

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

它引用了return !(&curr == other);

这一行

我认为首先编译器不喜欢我的operator ==函数,但我现在看不到它的引用。除了!之外,为什么它们会像一个而不是另一个?

如果我需要提供更多信息,请与我们联系。

2 个答案:

答案 0 :(得分: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是一个类型(BSTNode<Data>**),我不知道如何将它与你的迭代器实例(BSTIterator<Data>)进行比较这是显而易见的,因为你为你的班级定义了==!=,你从来没有为这样的操作定义和操作,是吗?

答案 1 :(得分:1)

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

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

请注意,在这种情况下,您希望按值比较指针:如果存储在其中的值相同,则两个指针相同,因此您使用address-of运算符( 1):

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

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