我正在阅读一本关于数据结构的书,现在正试图实现单链表数据结构。在实现迭代器时,我遇到了重载前缀和后缀增量的这些实现:
iterator &operator++()
{
this->current = this->current->next;
return *this;
}
iterator &operator++(int)
{
iterator old = *this;
++(*this);
return old;
}
我知道第一个是前缀,第二个是后缀,但我不明白为什么重载的后缀增量有不同的代码?如果我这样做会有什么问题?
iterator &operator++(int)
{
this->current = this->current->next;
return *this;
}
提前致谢。
答案 0 :(得分:9)
实际上,两个postfix版本都是错误的。 后缀迭代器必须返回副本,而不是引用。
重点是后增量会更改增量对象,但会在增量之前返回它的版本。预增量会更改对象并返回递增的版本。他们的逻辑必须相应地不同。
这种区别是因为后增量和前增量对原始类型具有相同的语义。例如:
int i = 0;
std::cout << i++ << std::endl;
产生输出0.具有重载迭代器的类应该模仿该行为以保持一致性。如果您有自己的整数类,其中包含您已经显示的迭代器实现之一,则结果将为1,从而令人惊讶。
99%的情况下正确实现后缀增量:
iterator operator++(int)
{
iterator old = *this;
++(*this);
return old;
}