priority queue - template-parameter compare ???
-
hi
ich will ne priority queue einrichten, habe aber verständnissprobleme beim compare parameter.
da gibts ja den templateparameter Comparepriority_queue<T, Sequence, Compare>und den parameter comp vom typ Compare im konstruktor
priority_queue(const Compare& comp) // oder priority_queue(const value_type* first, const value_type* last, const Compare& comp)was muss ich dem template als paramter geben, damit ich im konstruktor ein funktionsobjekt( blub() ) an comp übergeben kann?
ich checks grad echt nicht

-
T bitt erstetzen!
bool ()(T const&, T const&)
oder:
typedef bool (funcpointer)(T const&, T const&)Keine Ahung obs so richtig war, musste mal testen.
-
Und wenn du mit Functoren arbeiten willst, benötigst du etwa so etwas:
struct my_comp { bool operator()(const T& l, const T& r) { return l<r; } }; priority_queue<T,my_comp> my_queue;
-
danke
template< typename T > struct my_comp { bool operator()(const T& l, const T& r) { return l<r; } }; priority_queue<T, vector<T>, my_comp<T> > my_queue( my_vector.begin(), my_vector.end(), my_comp() );richtig so?
-
Probiers doch einfach aus...
Für die "Standardvergleiche" gibts bereits was aus der STL! Das wäre dann in deinem Fall std::less<type>()
Alle:
negate<T>
plus<T>
minus<T>
multiplies<T>
divides<T>
modulus<T>
equal_to<T>
not_equal_to<T>
less[_equal]<T>
greater[_equal]<T>
logical_not/and/or<T>Findest du im Header functional.
-
Thomas (: schrieb:
Für die "Standardvergleiche" gibts bereits was aus der STL!
Danke, aber das geht nicht. Das mit dem '<' war nur ein Beispiel.
Ich muss nach einem externen Kriterium sortieren.Was ich machen will:
Eine Klasse hat eine Liste mit Objekten und eine mit Werten(int). In einer Methode sollen nun die Objekte nach den Werten sortiert in eine priority queue gespeichert werden, und diese wird an den Aufrufer zurückgegeben. Der Aufrufer hat also keinen Zugriff mehr auf die Liste mit den Vergleichswerten.Bleibt die Sortierung beim Kopieren erhalten, oder muss der Comparator immer verfügbar sein?
-
Ok erledigt, habs jetzt so gelöst:
struct weight_compare { Map weight_; weight_compare( const Map& weight ): weight_( weight ){} bool operator()( const int& lhs, const int& rhs ) { return weight_[lhs] > weight_[rhs]; } }; //... in der Klasse weight_compare comp_1( map_1 ); priority_queue< int, vector<int>, weight_compare > pqueue_1( comp_1 ); weight_compare comp_2( map_2 ); priority_queue< int, vector<int>, weight_compare > pqueue_2( comp_2 );
-
Bleibt die Sortierung beim Kopieren erhalten, oder muss der Comparator immer verfügbar sein?
-
Das Kriterium wird afaik kopiert (in dem Beispiel inklusive der gespeicherten Map).
@chp: Übrigens solltest du die "Map weight_;" als const setzen
Die STL reagiert etwas allergisch darauf, wenn sich die Sortierbedingungen im Laufe der Arbeit ändern können.