在C++中为迭代器编写运算符==函数

Writing an operator== function for an iterator in C++

本文关键字:运算符 函数 迭代器 C++      更新时间:2023-10-16

我意识到我很愚蠢,所以请宽容我。是的,这是一项作业,但我想了解我做错了什么,而不仅仅是答案。

我正在试着写一个运算符==和一个运算符!=函数,用于BSTIterator类模板中二进制搜索树上的迭代器。

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

private: 
BSTNode<Data>* curr;
...
bool operator==(BSTIterator<Data> const & other) const {
(here's where I do my magic)
}

操作员的设置相同!=。

我为==写作。。。

return (&curr == other);

我想我不需要括号,但无论如何。。。这就是我的目的

return !(&curr == other);

我的编译器有问题!=但并不明显。

它吐出了很多官样文章,但据我所知,相关部分是:

不匹配'operator!='在'&(常量BSITerator*)this)->BSITerator::curr!=其他

并且它引用了表示return !(&curr == other);的行

我想一开始编译器也不喜欢我的运算符==函数,但我现在看不到对它的引用。为什么除了!之外,它们基本上是一样的,它会喜欢一个而不喜欢另一个?

如果我需要提供更多信息,请告诉我。

正如我从代码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>)进行比较,这是显而易见的,因为你正在为你的类定义==!=,而你从未为这种操作定义和运算符,是吗?

第一件事是确定操作的语义。对于具有引用语义的类(迭代器表示对容器中元素的引用),等式的常见定义是引用完全相同的对象。概念上,it1 == it2等于&*it1 == &*it2(如果通过operator*访问的对象的地址相同*,则两个迭代器相同)。

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

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

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

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