我已经在pryority_queue中找到了元素,所以我创建了这个类:
template < typename T >
class AStarPryorityQueue : public std::priority_queue < T, std::vector < T > >{
public:
bool find(const T& value) {
auto it = std::find(this->c.begin(), this->c.end(), value);
if (it != this->c.end()){return true;}
else {return false;}
}
};
但是我还需要传递一个用于对此进行排序的仿函数。导师是:
class LessThanByHeuristic{
public:
LessThanByHeuristic(int dest,AStarHeuristic* heuristic,int mapWidth,bool reverse):
destTile(dest),heuristic(heuristic),tileMapWidth(mapWidth),reverse(reverse){}
bool operator()(const std::pair<double,int> lhs,const std::pair<double,int> rhs) const{
if(reverse){
return lhs.first + (*heuristic)(Vec2(lhs.second / tileMapWidth,lhs.second % tileMapWidth),
Vec2(destTile / tileMapWidth,destTile % tileMapWidth)) >
rhs.first + (*heuristic)(Vec2(rhs.second / tileMapWidth,rhs.second % tileMapWidth),
Vec2(destTile / tileMapWidth,destTile % tileMapWidth));
}
else{
return lhs.first + (*heuristic)(Vec2(lhs.second / tileMapWidth,lhs.second % tileMapWidth),
Vec2(destTile / tileMapWidth,destTile % tileMapWidth)) <
rhs.first + (*heuristic)(Vec2(rhs.second / tileMapWidth,rhs.second % tileMapWidth),
Vec2(destTile / tileMapWidth,destTile % tileMapWidth));
}
}
private:
int destTile;
AStarHeuristic* heuristic;
int tileMapWidth;
bool reverse;
};
如何创建传递仿函数及其参数的AStarPryorityQueue?
没有继承我做:
typedef std::priority_queue<std::pair<double,int>,std::vector<std::pair<double,int> >,LessThanByHeuristic> mypqType;
然后:
mypqType processHeap(LessThanByHeuristic(destTile,heuristic,mapWidth,true));
我现在如何使用我的AStarPryorityQueue类做到这一点?
答案 0 :(得分:0)
比较器是priority_queue
类型的一部分,因此您需要在继承声明中指定它:
class AStarPryorityQueue : public std::priority_queue <std::pair<double,int>, std::vector<std::pair<double,int>>, LessThanByHeuristic>
并且在你的构造函数中,由于你的LessThanByHeuristic不是默认构造的,你需要调用std :: priority-queue的构造函数:
AStarPryorityQueue(int destTile, AStarHeuristic* heuristic, int tileMapWidth, bool reverse) : std::priority_queue <std::pair<double,int>,std::vector < std::pair<double,int>>,LessThanByHeuristic>{LessThanByHeuristic{destTile, heuristic, tileMapWidth, reverse}}
...
编辑:我并非100%确定您实际上想要做什么 - 对于A *的实施,您通常需要一个可寻址优先级队列,您可以减少PQ中已存在条目的键。