簡體   English   中英

使用.find無法引用c ++ map / set迭代器

[英]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

樂觀地說,我想做的是搜索rowcolumn以確保它正在查看已被搜索的節點,因此我可以將隨附的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::mapstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM