C++ c++;使用.find映射/设置迭代器不可取消引用

C++ c++;使用.find映射/设置迭代器不可取消引用,c++,map,path-finding,C++,Map,Path Finding,我对使用映射比较陌生,目前我得到了调试断言失败表达式:map/set迭代器不可解引用 当我点击“重试”时,它会将我带到以下代码部分: auto-temp=mOpenMap.find(当前节点); 温度->秒=假 我假设这与.find(currentNode)返回映射的末尾有关,因为它没有找到它,但这里需要考虑的是,在手动调试时,我发现映射中唯一的节点确实包含了我让它搜索的currentNode的确切部分 我的地图是这样的: std::map mOpenMap 乐观地说,我希望它做的是搜索行和列,

我对使用映射比较陌生,目前我得到了
调试断言失败表达式:map/set迭代器不可解引用

当我点击“重试”时,它会将我带到以下代码部分:

auto-temp=mOpenMap.find(当前节点);
温度->秒=假

我假设这与
.find(currentNode)
返回映射的末尾有关,因为它没有找到它,但这里需要考虑的是,在手动调试时,我发现映射中唯一的
节点
确实包含了我让它搜索的
currentNode
的确切部分

我的地图是这样的:

std::map mOpenMap

乐观地说,我希望它做的是搜索
,以确定它正在查看已搜索的节点,以便我可以将附带的
布尔值
设置为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;
}

在取消引用迭代器之前,应检查
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
或其他节点的存在,那么最好使用
std::set


对于自定义搜索,
std::map
std::set
都使用由比较器排序的值集合。定义映射或集合时,可以将该比较器指定为第二个模板类型。如果省略,该比较器默认为
std::less
,它只是将对象与小于运算符进行比较,
运算符如果您所做的只是跟踪某些
PathNode
或其他对象的存在,则最好使用
std::set


对于自定义搜索,
std::map
std::set
都使用由比较器排序的值集合。定义映射或集合时,可以将该比较器指定为第二个模板类型。如果省略,该比较器默认为
std::less
,它只是将对象与小于运算符进行比较,
运算符您应该按照billz所说的检查结果。查找失败的最可能原因是您的映射被键入了
PathNode*
,这意味着它将只查找具有精确指针匹配的节点。搜索成员值与映射中成员值相同的pathnode将不起作用


如果需要映射位于
路径节点*
,则还需要提供一个
谓词作为映射的第三个参数。需要编写
谓词来比较两个
PathNode*
参数的成员值。

您应该按照billz所说的检查结果。查找失败的最可能原因是您的映射被键入了
PathNode*
,这意味着它将只查找具有精确指针匹配的节点。搜索成员值与映射中成员值相同的pathnode将不起作用


如果需要映射位于
路径节点*
,则还需要提供一个
谓词作为映射的第三个参数。需要编写
谓词来比较两个
PathNode*
参数的成员值。

有时这可能表示您通过值而不是引用将映射传递给函数,但在本例中,这看起来不太可能。有时这可能表示您通过值而不是引用将映射传递给函数,但在本例中,这看起来不太可能。这消除了错误,但在我消除更多错误之前,我不知道它是否真的起作用(确保路径正常工作)在试图查找STL容器时,需要确保每个迭代器都有效。顺便说一句,还有哪些错误?这消除了错误,但在我消除更多错误之前,我不知道它是否真的起作用(确保路径正常工作),在尝试查找STL容器时,您需要确保每个迭代器都有效。顺便说一句,还有什么错误?这不是对这个问题的真正回答,应该是一个评论。对于其他可能和我做同样事情的人来说,在答案中包含这些是一件非常好的事情。很多人只是浏览一下评论。评论太长了。在没有看到更多代码的情况下,很难说这是否正确有用,但是很少有人需要
std::map
,因为
std::set
不能更简洁地处理。这并不是问题的答案,这应该是一个评论。对于其他可能和我做同样事情的人来说,在答案中加入这样的内容是一件非常好的事情。很多人只是浏览一下评论。评论太长了。在没有看到更多代码的情况下,很难说这是否正确有用,但是很少需要
std::map
,而
std::set
不能更简洁地处理。