2012-09-28 42 views
3

假設代碼看起來依稀像這樣:(C++)只有迭代器可用時才爲迭代器查找end()?

bool LoadGame() { 
    vector<string> SaveFile = LoadFromSaveFile(); 
    Data = SaveFile.begin(); 
    LoadCharacters(&Data); 
    // containing LoadOneCharacter(&Data) calls 
    LoadLocations(&Data); 
    // >> LoadOneLocation(&Data) calls 
    // etc. 
} 

有沒有什麼辦法來檢查數據是否正在指着SAVEFILE :: LoadCharacters(),LoadLocations()等內結束(),同時,不及格SaveFile :: end()到LoadGame()調用的所有函數?

(如果只是取消引用結束()及以後拋出一個異常,而不是產生未定義行爲!)

回答

5

這是不可能的,在一般情況下

在特定情況下,您可以利用實現迭代器實現的具體細節以獲取容器。

標準容器庫的迭代器沒有這樣的細節有記錄 AFAIR。


一種特殊情況是輸入迭代像std::istream_iterator<>其可以總是進行比較,以默認構造的本身實例來檢查結束輸入。

std::istringstream iss("test"); 
std::istream_iterator<char> it(iss); 

// you can always check for end of input: 
while (std::istream_iterator<char>() != it) 
{ 
    it++; 
} 
+0

謝謝。我想現在我會安全地玩。 – ExOttoyuhr

+1

@ExOttoyuhr一個合理的策略。請注意,這不是爲了安全起見,而是要堅持只記錄庫的行爲。其餘的不僅不安全,它只是不受支持,可能會因構建配置,庫版本等而中斷。只是沒有選擇,真的(**除非你自己控制迭代器實現**) – sehe

+0

這就是我的意思是「安全地玩它」。 :)僅僅因爲特定編譯器的特定版本產生的未定義行爲可能是可取的,並不意味着使用該行爲是一個好主意。 (至於標準的個人實現,不必擔心個人實現是什麼標準。)(看看我的原始評論,我真的很遺憾地說「現在」,這聽起來像是我將進入C++道奇城一刻,它適合我的幻想......) – ExOttoyuhr

5

這是不可能的。在許多實現中,許多類型的迭代器只是指針,並且不瞭解底層容器。

您需要傳遞兩個迭代器,或者傳遞不同的結構,如range(其位於boost而不是C++ 0x IIRC)。

+0

謝謝 - 特別是對迭代器只是指針在引擎蓋下的觀點我沒有懷疑。 – ExOttoyuhr

+0

@ExOttoyuhr:不僅僅是「引擎蓋下」 - 所有非空指針也是有效的隨機訪問迭代器。 – ildjarn