PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : scheduler mit stl



lisan
17-01-2005, 12:34
Hi,

Ich schreibe an einem Simulationprogram fuer mehrstufige Kommunikationsnetze.
Dabei implenetiere ich einen Scheduler fuer einen Router.

Ich moechte dafuer priority queues nutzen.
Das ganze sieht etwa so aus.

std :: priority_queue <SchedObject *,std::vector<SchedObject *>,Wire::SortByWon> lruList;
for (unsigned int i = 0; i < ins.size(); i++)
lruList.push(ins[i]);

Wie du siehst versuche ich die konkurenten mit der Klasse SchedObjct zu abstrahieren.
Konkret kann so ein Objekt zum Beispiel ein Wire (Eine eingehende Leitung am Router) sein.
Die Sortierfunktion Wire::SortByWon ist der eigendliche Scheduler.
Leider weiss ich nicht wie ich das ganze dynamisch programmieren kann, d.h. nach den regeln der Vererbung soll die zugehoerige sortiermethode verwendet werden.

wraith
17-01-2005, 19:46
Also du hast in deiner (einen) queue verschiedene Zeiger auf Instanzen von Unterklassen, zb. Wire, aber auch andere, von SchedObject gespeichert?

Sowas in der Art?
(das sortieren nach name sollst du natürlich nicht machen, aber auf die Schnelle ist mir nichts besseres/kürzeres eingefallen, soll auch nur die Idee verdeutlichen)


#include <iostream>
#include <string>
#include <queue>

class Base
{
public:
virtual std::string name() const { return "Base"; }
};

class Sub1 : public Base
{
public:
std::string name() const { return "Sub1"; }
};

class Sub2 : public Base
{
public:
std::string name() const { return "Sub2"; }
};

struct cmpBase
{
bool operator()(const Base *lhs,const Base *rhs) const
{
return lhs->name() < rhs->name();
}
};

int main()
{
std::priority_queue<Base*,std::vector<Base*>,cmpBase > pqlist;

pqlist.push(new Base);
pqlist.push(new Sub1);
pqlist.push(new Sub2);
pqlist.push(new Sub1);
pqlist.push(new Sub2);
pqlist.push(new Base);

while(!pqlist.empty())
{
std::cout << pqlist.top()->name() << std::endl;
pqlist.pop();
}
}

lisan
19-01-2005, 18:14
Ja so etwas,
Zu schedulende objekte sind von einer abstrakten basis abgeleitet.

Ich weiss nun nicht, wie ich fuer jedes dieser objekte eine eigene cmpBase schreibe.
So dass

std :: priority_queue<Base*,std::vector<Base*>,cmpBase > pqlist;

nicht dein cmpBase sondern das spezifische cmpBase der klasse aufgerufen wird.


Ausserdem moechte ich wissen, wie ich in der Compare-methode nicht nur an die ihr uebergebenen parameter herankomme sondern auch an dinge aus der klasse in der sie definiert wird.

z.B.
class Sub1:
std::vector<int> value;
struct Compare {
operaror() (Wire* a, Wire *b) {
// macht etwas mit value ^
}
}
// oder
class Compare:
operator() (Wire* a, Wire* b) {
// macht etwas mit value ^
}

Ich kann leider so wie ich das sehe, diese Compare varianten nicht ueberladen, so dass sie fuer jede von der Base abgeleitete Klasse individuell sind.