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