2017-07-05 72 views
0

我nedded找到在pryority_queue元素繼承的類,所以我創建的類:使用自定義的比較中,從性病:: priority_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;} 
    } 
}; 

但我也需要通過使用一個仿函數排序這一信息。Funtor是:

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

'std :: priority_queue',因爲所有的STL容器和適配器都不能被繼承(事實上它沒有'virtual'析構函數)。 –

回答

0

比較是priority_queue「S型的一部分,因此,您需要在繼承聲明指定它:

class AStarPryorityQueue : public std::priority_queue <std::pair<double,int>, std::vector<std::pair<double,int>>, LessThanByHeuristic> 

,並在構造函數,因爲你LessThanByHeuristic不是默認 - 構造的,你需要調用STD的構造::優先級隊列:

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中已有條目的密鑰。