[英]c++ map/set iterator not dereferencable using .find
我對使用地圖還比較陌生,目前正在獲取“ Debug Assertion Failed Expression: map/set iterator not dereferencable
當我點擊重試時,它帶我到這段代碼:
auto temp = mOpenMap.find(currentNode); temp->second = false;
我認為這與.find(currentNode)
返回地圖的末尾有關,因為它沒有找到它,但是這里有關的部分是進行手動調試時,我發現地圖中唯一的Node
確實包含我要搜索的currentNode
的確切部分。
我的地圖是這樣的:
std::map<PathNode*, bool> mOpenMap
樂觀地說,我想做的是搜索row
和column
以確保它正在查看已被搜索的節點,因此我可以將隨附的boolean
設置為false。
我想知道的是,地圖通常如何搜索對象? 還是更好,我該如何使用自定義搜索進行地圖搜索?
您應該檢查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;
}
如果您正在做的只是跟蹤某個PathNode
或其他PathNode
的存在,那么最好使用std::set
。
對於自定義搜索, std::map
和std::set
可以使用由比較器排序的值的集合。 定義映射或集合時,可以將比較器指定為第二個模板類型。 如果省略,則該比較器默認為std::less
,它僅將對象與小於運算operator<
。 如所寫,您的地圖mOpenMap
使用指針的值來執行此比較,這可能不是您想要的。
我建議您聲明並定義PathNode::operator<
,並將mOpenMap
替換為std::set<PathNode>
類型的成員。 這將取消實際的PathNode
值,而不是指針(在正常情況下可能永遠不會發生沖突)。
請記住,您的PathNode::operator<
應該生成嚴格的PathNode對象排序 。 這是比較器對std :: map和std :: set的要求。 如果您不遵循此規則,它將不正常地運行,但是會編譯並運行,因此請確保注意此細節。
您應該按照Billz所說的檢查結果。 查找失敗的最可能原因是您的地圖在PathNode *
上進行了鍵控,這意味着它只會找到指針完全匹配的節點。 搜索具有與映射中的成員值相同的成員值的pathnode將不起作用。
如果需要將地圖放在PathNode *
,那么還需要提供predicate
作為地圖的第三個參數。 將需要編寫predicate
來比較兩個PathNode *
參數的成員值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.