2014-09-23 49 views
1

我有比較新的使用地圖,以及目前我得到的Debug Assertion Failed Expression: map/set iterator not dereferencableC++地圖/套迭代器不使用dereferencable .find

當我打重試它帶給我的這部分代碼:

auto temp = mOpenMap.find(currentNode); temp->second = false;

我認爲這具有與.find(currentNode)返回的地圖做結尾,因爲它沒有找到它,但這裏的有關部分是當仁不讓的手動調試,我發現,在地圖中唯一Node確實包含了currentNode的確切部分我曾搜索過f要麼。

我的地圖是這樣的:

std::map<PathNode*, bool> mOpenMap

樂觀我想它做的是搜索的rowcolumn以確定它正在尋找一個已經被搜索過,這樣一個節點我可以將伴隨的boolean設置爲false。

我想知道的是,地圖一般如何搜索對象?或者更好的是,我怎樣才能使用自定義搜索進行地圖搜索?

+0

有時候,這可能表示您已將值映射傳遞給函數而不是引用,但在這種情況下看起來不太可能。 – 2014-09-23 01:27:39

回答

3

您應該檢查std::map::find不提領迭代器之前找到的元素:

auto temp = mOpenMap.find(currentNode); 
if (temp != mOpenMap.end()) // check temp is pointing to underneath element of a map 
{ 
    temp->second = false; 
} 
+0

這個擺脫了錯誤,但直到我擺脫了一些更多的錯誤,我不知道它是否真的做到了這一點(確保路徑工作正常) – 2014-09-23 01:28:09

+0

你需要確保每個迭代器在你嘗試時有效找到他們的STL容器。順便說一句,最新的其他錯誤? – billz 2014-09-23 01:35:20

1

如果你正在做的是跟蹤一些PathNode或其他存在,你會更好使用std::set

對於自定義搜索,std::mapstd::set都使用由比較器排序的值集合。當定義地圖或集合時,可以將比較器指定爲第二個模板類型。如果省略,那麼該比較器默認爲std::less,它只是比較對象與小於運算符operator<。正如所寫,您的地圖mOpenMap正在使用指針的值執行此比較,這可能不是您想要的。

我建議你聲明並定義PathNode::operator<,並用std::set<PathNode>類型的成員替換mOpenMap。這將關閉實際值PathNode,而不是指針(在正常情況下可能永遠不會碰撞)。

請記住,您的PathNode::operator<應該生成一個嚴格的訂購的PathNode對象。這是std :: map和std :: set比較器的要求。如果你不遵循這個規則,它會表現不正常,但它會編譯和運行,所以確保你注意這個細節。

+0

這不是問題的答案,它應該是一個評論。 – 2014-09-23 01:28:48

+0

對於其他可能做同樣事情的人來說,這是一件非常好的事情。很多人只會瀏覽評論。 – 2014-09-23 01:30:27

+0

評論太長了。很難真正地說如果沒有看到更多的代碼,這是否正確有用,但很少需要'std :: map ''std :: set '不能更簡潔地處理。 – Wug 2014-09-23 01:31:07

1

您應該檢查結果作爲billz說。發現失敗的最可能的原因是您的地圖被鎖定在PathNode *上,這意味着它只會找到具有精確指針匹配的節點。使用與地圖中相同的成員值搜索路徑節點將不起作用。

如果您需要的地圖位於PathNode *,那麼您還需要提供predicate作爲地圖的第三個參數。將需要編寫predicate來比較兩個PathNode *參數的成員值。