c++中迭代器的前缀和后缀自增操作符重载实现的区别



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

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;
}

最新更新