首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在继承自std::priority_queue的类中使用自定义比较器

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

Stack Overflow用户
提问于 2017-07-05 12:55:42
回答 1查看 186关注 0票数 0

我需要在pryority_queue中查找元素,所以我创建了这个类:

代码语言:javascript
复制
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;}
    }
};

但我还需要传递一个用于对this.The函数进行排序的函数器:

代码语言:javascript
复制
    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?

在没有继承的情况下,我这样做:

代码语言:javascript
复制
typedef std::priority_queue<std::pair<double,int>,std::vector<std::pair<double,int> >,LessThanByHeuristic>  mypqType;

然后:

代码语言:javascript
复制
mypqType processHeap(LessThanByHeuristic(destTile,heuristic,mapWidth,true));

我现在怎么用我的AStarPryorityQueue类做到这一点呢?

EN

回答 1

Stack Overflow用户

发布于 2017-07-05 13:13:37

比较器是priority_queue类型的一部分,因此您需要在继承声明中指定它:

代码语言:javascript
复制
class AStarPryorityQueue : public std::priority_queue <std::pair<double,int>, std::vector<std::pair<double,int>>, LessThanByHeuristic>

在构造函数中,由于优先级不是默认可构造的,因此需要调用std::LessThanByHeuristic -LessThanByHeuristic的构造函数:

代码语言:javascript
复制
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}}
...

编辑:我不能百分之百确定这实际上是你想要做的--对于A*的实现,你通常需要一个可寻址的优先级队列,在这个队列中你可以减少PQ中已经存在的条目的键。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44917283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档