2013-03-11 97 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