我正在读一本有关数据结构的书,现在试图实现单链接列表数据结构。在实现迭代器时,我遇到了以下重载前缀和后缀增量的实现:
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;
}
提前致谢。
最佳答案
实际上,两个后缀版本都是错误的。后缀迭代器必须返回副本,而不是引用。
关键是后期增量会更改增量对象,但会在增量之前返回其版本。预增量更改对象并返回增量版本。它们的逻辑必须相应地不同。
之所以这样区分,是因为后增量和前增量在原始类型上具有相同的语义。例:
int i = 0;
std::cout << i++ << std::endl;
产生输出0。具有重载迭代器的类应模仿该行为以保持一致性。如果您拥有自己的整数类以及所显示的迭代器实现之一,则结果将为1,因此令人惊讶。
后缀增量的正确实现是在99%的情况下:
iterator operator++(int)
{
iterator old = *this;
++(*this);
return old;
}
关于c++ - 前缀和后缀增量运算符重载C++中迭代器实现的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15346233/