我正在实施A*
最短路径算法。 Openlist部分存储将要访问的所有节点。该列表就像一个优先级队列,第一个元素具有最小的成本值,因此在每次迭代中,我们只需弹出第一个元素并访问它。但是在迭代中,我们需要遍历这个节点的邻居,并检查邻居是否在Openlist中。C++设置如何按值排序集和按键搜索
因此,这意味着这Openlist需要支持两种操作:
- 自动分拣
- 查找一个节点(通过其ID)
这里的问题是,Openlist会按成本值排序,而查找需要基于邻居节点(相邻节点)的ID。所以我正在考虑使用set,其中的元素是节点。但是我不知道如何通过它在这个集合中的ID来查找元素。
struct astar_node
{
string id;
double f; //estimated cost;
double g; //distance from source to this node;
double h; //heuristic cost from this node to target;
};
struct openlist_compare
{
bool operator()(const astar_node &node1, const astar_node &node2){
return node1.f < node2.f ;
}
};
std::set<astar_node, openlist_compare> Openlist;
保留两个集合,一个用'f'索引,另一个用'id'索引。 –
你不会在一个集合中通过它的ID来查找元素 - 至少不是遍历整个集合。这不是什么套。 – immibis
@但find的set()方法做什么? – daydayup