2013-03-11 162 views
0

我正在读一本关于数据结构的书,现在正试图实现单链表数据结构。在实施迭代器,我所遇到过载的前缀和后缀增量的这些实现:前缀和后缀增量运算符在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; 
} 

在此先感谢。

回答

9

其实,两个后缀版本都是错误的。 后缀迭代器必须返回一个副本,而不是引用。

问题是,后增量会更改递增的对象,但会在递增前返回它的一个版本。预增量更改对象并返回增加后的版本。他们的逻辑必须有所不同。

这种区别是因为后置和前置增量在原始类型上具有相同的语义。例如:

int i = 0; 
std::cout << i++ << std::endl; 

会产生输出0.您的重载迭代器类应该模拟该行为以保持一致性。如果你有你自己的整型类和你所展示的一个迭代器实现,那么结果将是1,从而令人惊讶。

的正确实施后缀增量在99%的情况:

iterator operator++(int) 
{ 
    iterator old = *this; 
    ++(*this); 
    return old; 
} 
+0

我认为第一个是返回一个副本 – 2013-03-11 18:56:17

+0

为什么是第一个版本不对? – 2013-03-11 18:57:11

+1

@KudayarPirimbaev:不,请注意声明中的'&'(“iterator&operator ++”)。它返回一个局部变量的引用,因此具有未定义的行为。 – thiton 2013-03-11 18:57:15