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