在C++中为迭代器编写运算符==函数
Writing an operator== function for an iterator in C++
我意识到我很愚蠢,所以请宽容我。是的,这是一项作业,但我想了解我做错了什么,而不仅仅是答案。
我正在试着写一个运算符==和一个运算符!=函数,用于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
进行比较,这可能没有意义。您想要比较两个存储的指针。
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 在 C++ 中调用类中的运算符函数
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- 为什么 ADL 的运算符函数行为与其他函数不同?
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- 第二个常量在运算符函数中做什么?
- 重载赋值运算符函数和复制构造函数中的错误
- 内置类型的运算符函数
- 如何调用运算符函数添加两个对象?
- Const 仍然允许在运算符函数 c++ 下进行更改
- 在呼叫运算符函数const中调用运算符时错误
- 是否有一种方法可以在超载运算符函数中接触默认运算符函数
- 重载时获取堆栈溢出 >> 运算符函数是为类调用的。我需要进行哪些更改?
- 运算符 [] 函数的实现是如何工作的
- C++:使用父类运算符函数更新子类对象的继承变量
- 创建一个接受 2 个输入参数的文本运算符函数
- 为什么找不到重载运算符函数?
- 为什么auto_ptr中有模板复制构造函数和覆盖运算符函数
- 为什么某些C++标准库“运算符<<”函数将其流宽度重置为 0
- C++SFINAE运算符/函数结果类型检查