Guru of the week:#18 迭代指標. (轉)
/*此文是譯者出於自娛翻譯的GotW(Guru of the Week)系列文章的一篇,原文的版權是屬於Hub Sutter(著名的C++專家,《Exceptional C++》的作者)。此文的翻譯沒有徵得原作者的同意,只供學習討論。——譯者:黃森堂*/
#18 迭代指標.
難度:7/10
任何在使用標準庫都知道使用公共與非公共iterator容易犯錯誤,你發現了多少種呢?
問題:
以下程式至少有四處關於iterator的問題,你發現多少呢?
int main( int, char*[] ) { vector 解決方法: 以下程式至少有四處關於iterator的問題,你發現多少呢? int main( int, char*[] ) { vector 到這兒是好的,Date類過載了運算子>>( istream&, Date& )來提供抽取功能,Date類用istream_iterator vector 錯誤:這兒是的,原為last指標可能指向e.end,因此這不是一個有新效的間接引用的iterator find演算法需要兩個引數,如果值沒有找到,在這情況裡,如果"12/31/95"不在e裡面,那麼last是等於e.end(),它指向越過容器的底,且是無效的iterator. copy( first, last, ostream_iterator 錯誤:這兒是非法的,原因first指標實際上在last之後。 如果"01/01/95"在 e裡面不找到,但"12/31/95"找到了,那麼迭代品last將指向在集合裡的物件(Date物件等於"12/31/95"),但first指向end,然而,copy需要first指向第一個在物件集合的物件,同樣last是相似的,[first, last]必須是有效的範圍。 除非你使用標準庫的版本,或許問題在除錯階段中找到。 e.insert( --e.end(), TodaysDate() ); 錯誤:"--e.end()"是不合法的。 這個理由簡單,vector Date* f(); // 返回Date* p = --f(); // error, but could be "f() - 1" 幸虧的是,這兒沒有損失: e.insert( e.end() - 1, TodaysDate() ); 錯誤:這兒仍然有其它錯誤...,如果e是空的,e.end()-1是無效的iterator. copy( first, last, ostream_iterator 錯誤:first與last不是有效的iterator 當你在插入物件到vector的任何時候,它不是重新分配緩衝,而是在塊中進行追加,然而,有時vector可能滿了,此時增加物件將觸發重新分配,這兒,例如當插入操作返回結果,vector可能需要或不需要重新分配,如果它沒有這樣做,在我們已存在的iterator與copy中可能是無效的。 當你使用iterator時,這兒有四點注意: 1.有效的值:間接引用的iterator是有效嗎?,例如,"*e.end()"總是邏輯錯誤的。 2.有效的生存期:當你開始使用iterator時候它還仍然有效嗎?,當我們獲得了經過若干操作後它還有效嗎? 3.有效的範圍:成對的iterator是否是有效的範圍呢?,first是在last之前嗎?兩者是否都指向相同的容器裡面嗎? 4.非法操作內建型別:例如:在"--e.end()"上面修改內建型別的臨時物件(幸運的是,在你的程式碼中將捕捉到這種錯誤與類的iterator型別,庫的作者允許這種經常在排序任何物件的語法的轉換).總結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-995470/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++ articles:Guru of the Week #3:使用標準庫 (轉)C++
- C++ articles:Guru of the Week #1 (轉)C++
- Guru of the week:#17 型別對映. (轉)型別
- Guru of the week:#19 自動型別轉換. (轉)型別
- Guru of the Week 條款19:自動轉換 (轉)
- Guru of the Week 條款27:轉呼叫函式 (轉)函式
- C++ articles:Guru of the Week #4 -- Class Mechantics (轉)C++
- Guru of the Week 條款28:“Fast Pimpl”技術 (轉)AST
- Guru of The week #20 程式碼的複雜性 Ⅰ. (轉)
- Guru of the Week 條款09:記憶體管理(上篇) (轉)記憶體
- Guru of the Week 條款10:記憶體管理(下篇) (轉)記憶體
- Guru of the Week 條款24:編譯級防火牆 (轉)編譯防火牆
- Guru of the Week 條款30附錄:介面原則 (轉)
- Guru of the Week 條款05:覆寫虛擬函式 (轉)函式
- Guru of the Week 條款13:物件導向程式設計 (轉)物件程式設計
- Guru of the Week #5:虛擬函式的重新定義 (轉)函式
- Guru of the Week 條款07:編譯期的依賴性 (轉)編譯
- Guru of the Week 條款11:物件等同(Object Identity)問題 (轉)物件ObjectIDE
- Guru of the Week 條款14:類之間的關係(上篇) (轉)
- Guru of the Week 條款15:類之間的關係(下篇) (轉)
- Guru of the Week 條款16:具有最大可複用性的通用Containers (轉)AI
- 實現反轉連結串列--遞迴、迭代、雙指標、棧遞迴指標
- 指標 (轉)指標
- Guru of the Week 條款08:GotW挑戰篇——異常處理的安全性 (轉)Go
- Guru of the Week 條款23:物件的生存期(第二部分) (轉)物件
- Guru of the Week 條款22:物件的生存期(第一部分) (轉)物件
- Guru of the Week 條款21:程式碼的複雜性(第二部分) (轉)
- Guru of the Week 條款20:程式碼的複雜性(第一部分) (轉)
- CR指標(轉載)指標
- 淺談指標 (轉)指標
- 指標問題的一點體會(區別 [指向指標的指標] 與 [指標的指標] .) (轉)指標
- C++指標轉換C++指標
- 人氣指標(轉載)指標
- 隨機指標(轉載)隨機指標
- 我眼中的指標 (轉)指標
- 改變滑鼠指標 (轉)指標
- SMART POINTER(智慧指標) (轉)指標
- NULL 指標、零指標、野指標Null指標