我正在尝试实现一个 List 和 Iterator 类(我们的作业,我们应该以 stl 样式实现我们自己的列表)。我有一个关于++
运营商的问题。在我的实现中,++
不返回任何内容:
void operator++();
但是我的一个朋友是这样实现的:
Iterator& operator++();
我对它们都进行了测试,似乎它们都有效。但我相信一定有很大的不同。但我是 C++ 语言的新手。所以我看不到。有人可以帮我吗?
我正在尝试实现一个 List 和 Iterator 类(我们的作业,我们应该以 stl 样式实现我们自己的列表)。我有一个关于++
运营商的问题。在我的实现中,++
不返回任何内容:
void operator++();
但是我的一个朋友是这样实现的:
Iterator& operator++();
我对它们都进行了测试,似乎它们都有效。但我相信一定有很大的不同。但我是 C++ 语言的新手。所以我看不到。有人可以帮我吗?
这里的共同约定是重载运算符应该类似于普通运算符。例如,您可以:
int x = 5;
int y = ++x;
因此,您的迭代器确实应该在类似的上下文中可用:
Iterator i = smth.begin();
Iterator j = ++i;
你朋友的版本允许这样做。
还有一个古老的 C 笑话:
++i = 0;
所以是的,你operator ++()
应该*this
作为左值返回以允许这种东西,所以返回类型是Iterator&
而不是Iterator
or const Iterator&
。
不同之处在于您朋友的版本可以以如下形式调用
// loop that skips the first element
while (++it != end)
// perform operation
it
一些迭代器在哪里。库函数和客户端代码可能依赖于此,所以总是*this
从重载的operator++
. 所有标准库迭代器都以这种方式工作,对其建模的指针也是如此。
不同之处在于,他的运算符可以像迭代器是指针一样使用,而您的则不能。使用指针,您可以执行以下操作:
char *p1, *p2;
...
p1 = ++p2;
为使其与迭代器一起使用,++
运算符必须在增量之前(或之后)返回值,具体取决于运算符的前置或后置位置。您的实现不会那样做。尽管从技术上讲它是可以的,但结果运算符并没有那么实用,因此最好更改您的实现以返回一个值。