stl-container für warteschleife
-
Lars Hupel schrieb:
danke erstmal!
bei der möglichkeit muss ich aber "Mytime" noch zwei Variablen
int id1,id2;
hinzufügen, sonst kann ich ja nur eine zeit sortieren... ich will ja noch die id's verwalten.
jo. oder MyTime so lassen und benutzen
struct MyData { private: MyTime time; int id1; int id2; public: friend bool operator<(MyData const& a,MyData const& b){ if(a.time<b.time) return true; if(a.time>b.time) return false; if(a.id1<b.id1) return true; ... } };
aber warum eigentlich. wolltest du nicht nur nach time sortieren?
struct MyData { private: MyTime time; int id1; int id2; public: friend bool operator<(MyData const& a,MyData const& b){ return a.time<b.time; } };
-
ok, danke erstmal.
1. erklär mir aber bitte noch mal schnell, was das "friend" da bedeutet.
2. kann ich auch den operator <= überladen? welchen algorithmus aus <algorithm> zum vergleich nehmen?
-
Lars Hupel schrieb:
ok, danke erstmal.
1. erklär mir aber bitte noch mal schnell, was das "friend" da bedeutet.der op< ist global. er steht außerhalb der klasse. aber er greift auf private members zu, deswegen muss er innerhalb der klasse als friend deklariert werden.
alsostruct MyData { private: MyTime time; int id1; int id2; public: friend bool operator<(MyData const& a,MyData const& b); }; bool operator<(MyData const& a,MyData const& b){ return a.time<b.time; }
jetzt darf ich mir aber erlauben, die definition gleich an die friend-deklaration zu hängen, dann gehts auch und bedeutet das gleiche.
2. kann ich auch den operator <= überladen?
klar.
friend bool operator<=(MyData const& a,MyData const& b); }; bool operator<(MyData const& a,MyData const& b){ return a.time<=b.time; }
welchen algorithmus aus <algorithm> zum vergleich nehmen?
verstehe die frage nicht.
-
Lars Hupel schrieb:
welchen algorithmus aus <algorithm> zum vergleich nehmen?
die priority queue sortiert selber, du musst nur den operator< überladen, das wars. Der rest ist magie
-
damit meine ich, dass es solche funktionen wie less und greater gibt. etwa auch lessequal oder so was in der art?
-
Lars Hupel schrieb:
damit meine ich, dass es solche funktionen wie less und greater gibt. etwa auch lessequal oder so was in der art?
tut nicht not.
statt lessequal(a,b) kann man auch !less(b,a) schreiben.
also
op< ist für die meisten sachen völlig ausreichen.
wegen
a<b definiert
a>b b<a
a>=b !(b<a)
a<=b !(a>b)
a!=b a>b||a<b
a==b !(a>b||a<b)aus performancetechnischen gründen benutzen mache leet haxors auch noch den op==. aber mehr als zwei (less und equal) braucht keiner.
-
volkard schrieb:
aus performancetechnischen gründen benutzen mache leet haxors auch noch den op==. aber mehr als zwei (less und equal) braucht keiner.
//Edit sorry zuviel zitiert
-
Lars Hupel schrieb:
volkard schrieb:
aus performancetechnischen gründen benutzen mache leet haxors auch noch den op==. aber mehr als zwei (less und equal) braucht keiner.
a==b !(a>b||a<b)
wenn etwas weder größer noch kleiner als etwas anderes ist, so muss es zwangsläufig gleich sein ;). sind halt im gegensatz zu op== immer 2 operator aufrufe, was normalerweise langsamer sein sollte, als direkt zu testen, ob a==b ist.
-
is mir klar, aber wer oder was sind leet haxors?
-
Wie sortiert der priority_queue?
kleinstes Top, Groesstes end? (bei int werten)Wie benutzt man einen priority_queue?
priority_queue<MyStruct> bla; ???Danke fuer Tipps und gedanken,
MFG Ghost
-
also da wird bei pop() immer das element mit der höchsten priorität gelöscht. wie die elemente intern sortiert sind, ist ja eigentlich wurscht.
aber wie kann man nun auf das 0. element (sprich das welches als nächstes durch pop gelöscht wird) zugreifen
container[0]
-
Lars Hupel schrieb:
also da wird bei pop() immer das element mit der höchsten priorität gelöscht. wie die elemente intern sortiert sind, ist ja eigentlich wurscht.
aber wie kann man nun auf das 0. element (sprich das welches als nächstes durch pop gelöscht wird) zugreifen
container[0]
top()