2017-07-05 1 views
0

I nedded haben Elemente in einem pryority_queue zu finden, so habe ich die Klasse:einen benutzerdefinierten Komparator in einer Klasse, die von std :: erbt 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;} 
    } 
}; 

Aber ich brauche auch einen Funktor übergeben verwendet Art this.The funtor ist:

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; 
    }; 

Wie erstelle ich einen AStarPryorityQueue die Funktors und seine Argumente zu übergeben?

Ohne Vererbung ich tun:

typedef std::priority_queue<std::pair<double,int>,std::vector<std::pair<double,int> >,LessThanByHeuristic> mypqType; 

und dann:

mypqType processHeap(LessThanByHeuristic(destTile,heuristic,mapWidth,true)); 

Wie kann ich es jetzt tun mit meiner AStarPryorityQueue Klasse?

+0

'std :: priority_queue', wie alle STL-Container und Adapter, soll nicht von geerbt werden (in Wirklichkeit hat es keinen' virtuellen' Destruktor). –

Antwort

0

Der Komparator ist ein Teil der priority_queue ‚s-Typ, so müssen Sie es in Ihrem Erbe Erklärung angeben:

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

und in Ihrem Konstruktor, da Ihr LessThanByHeuristic nicht-konstruierbar Standard, müssen Sie

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}} 
... 

EDIT: den Konstruktor von std :: Priorität-Warteschlange nenne ich nicht 100% sicher bin, das ist eigentlich das, was Sie tun wollen - für eine Implementierung von A *, müssen Sie in der Regel eine adressierbaren Priorität Warteschlange Hier können Sie den Schlüssel eines bereits vorhandenen Eintrags in der PQ verkleinern.

Verwandte Themen