我正在研究C ++中的A *寻路算法。我有下面的简单代码,现在我需要找到最低F的对象。我知道如何通过迭代向量并手动比较它来做到这一点,但我认为可能有一些其他更简单的方法需要更少的代码。谢谢你的回答
struct Node
{
int f;
};
void func()
{
std::vector<Node> nodes;
//fill nodes with some objects
//now find Node object with smallest F
}
答案 0 :(得分:2)
std::min_element和lambda比较器似乎最简洁。顺便说一句,使用普通向量似乎打败了使用快速搜索算法(如A *)的目的。在开发过程中没问题,但对于最终版本,您应该使用快速优先级队列,例如基于堆的std::priority_queue。
答案 1 :(得分:0)
您可以保留一个temp int变量,并在此变量记录中vector的最小值索引。每次将新值推送到矢量时,都可以将它与矢量值与临时索引进行比较,并记录新的最小值索引。
答案 2 :(得分:0)
我在实施A *算法时遇到了同样的问题。
看看boost :: multi_index。它允许您拥有包含许多键的地图。 所以你可以同时拥有:用F“排序”节点(当其中一个键为F时)和按节点位置快速查找(当第二个键是'Node'时)A *中需要什么。
对于'F'作为键,您需要指定此键不是唯一的,因为可能有许多具有相同F值的项(因此对于此键,multi_index需要表现为std :: multimap)。否则,对于这种情况,multimap将表现得像地图,并且不会存储具有相同“F”的节点。
当使用multi_index时,您可以按键'F'取第一个项目,这将是具有最低'F'值的项目。 (AFAIR你可以指定排序顺序)