繁体   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