2013-03-23 107 views
0

我正在寫一個奇怪的佈局棋盤遊戲,所以我有一個map從一個點到地方的價值。如果地點爲空,則不在地圖中,因此如果find返回end(),則該地點爲空。如果我想檢查一下特定地點的顏色,我使用以下內容。這段代碼是否有效?或者換句話說是安全的比較endlColour比較.end()和價值

enum COLOUR {BLACK,WHITE}

this->mBoard.find(Point(p.x - 1, p.y))->second == lColour

其中lColour類型爲COLOUR

+0

你認爲'end() - > second'會是什麼值? – IronMensan 2013-03-23 20:49:47

回答

2

沒有的,你在做什麼也不安全。過去的迭代器(由end()返回的迭代器)不能被解除引用。對find()的結果您正在執行->:如果該結果是過去結束的,則調用未定義的行爲。

+0

它返回'true'的機會是什麼? – en4bz 2013-03-23 21:07:03

+0

你是否認真地建議你要寫一個只有在你幸運的時候才能使用的程序? – john 2013-03-23 21:10:44

+0

@ user2049175大概跟返回'false'一樣。從某種意義上說,它是*完全隨機的行爲。* – Angew 2013-03-23 21:30:01

1

不,這不是因爲這意味着取消引用結束迭代器,而是未定義的行爲。

2

您應該檢查返回的迭代器找到!=試圖獲得第二個元素之前結束。

const auto& point_color = this->mBoard.find(Point(p.x - 1, p.y); 
if (point_color != this->mBoard.end() && 
    point_color->second == lColour) { 
    // something 
}