在继承自std :: priority_queue的类中使用自定义比较器

时间:2017-07-05 04:55:42

标签: c++ inheritance priority-queue functor

我已经在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类做到这一点?

1 个答案:

答案 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中已存在条目的键。