前缀和后缀增量运算符之间的差异在C++中重载迭代器的实现

Kud*_*aev 0 c++ iterator linked-list operator-overloading

我正在阅读一本关于数据结构的书,现在正试图实现单链表数据结构.在实现迭代器时,我遇到了重载前缀和后缀增量的这些实现:

iterator &operator++()
{
    this->current = this->current->next;
    return *this;
}

iterator &operator++(int)
{
    iterator old = *this;
    ++(*this);
    return old;
}
Run Code Online (Sandbox Code Playgroud)

我知道第一个是前缀,第二个是后缀,但我不明白为什么重载的后缀增量有不同的代码?如果我这样做会有什么问题?

iterator &operator++(int)
{
    this->current = this->current->next;
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢.

thi*_*ton 9

实际上,两个postfix版本都是错误的.后缀迭代器必须返回副本,而不是引用.

关键是后增量会更改增量对象,但会在增量之前返回它的版本.预增量会更改对象并返回递增的版本.他们的逻辑必须相应不同.

之所以进行这种区分,是因为后增量和预增量对原始类型具有相同的语义.例:

int i = 0;
std::cout << i++ << std::endl;
Run Code Online (Sandbox Code Playgroud)

产生输出0.具有重载迭代器的类应该模仿该行为以保持一致性.如果你有自己的整数类,你已经显示了一个迭代器实现,那么结果将是1,从而令人惊讶.

在99%的情况下,正确实现后缀增量:

iterator operator++(int)
{
    iterator old = *this;
    ++(*this);
    return old;
}
Run Code Online (Sandbox Code Playgroud)