VC++ 2010 exp. Stos funkcji wykonywanych wg. priorytetu

0

Witam, piszę pewien program i potrzebuje coś w rodzaju stosu funkcji, lecz chciałbym żeby były wykonywane wg. ich priorytetu (określanego podczas dodawania funkcji do stosu). Czy ktoś mógłby zasugerować jak to zrobić? Może by się udało wysmażyć jakiś sample? :>
Z góry dzięks

1

Nie wiem czy o to chodzi, ale mozna zrobic taki myk. Sa tutaj nalozone pewne ograniczenia. Mapa automatycznie sortuje elem. tak ze najpierw sa te z najmniejszym kluczem.

typedef void (*pointer)(int);
typedef map<int, pointer> stack;
typedef map<int, pointer>::iterator it;

void func1(int a)
{
    cout << "Func 1: " << a << endl;
}

void func2(int a)
{
    cout << "Func 2: " << a*2 << endl;
}

int main()
{
    stack data;
    it dataIt;
    data.insert(make_pair(5,&func1));
    data.insert(make_pair(2,&func2));
    dataIt = data.begin();
    (*dataIt).second(5);
    (*++dataIt).second(5);
    return 0;
}
0

dzięks, o to mi chodziło ale nie wiedziałem pod jakim hasłem szukać

jeszcze jak byś mógł podrzucić pomysł jak zrobić żeby sortowało od najwiekszego priorytetu do najmniejszego a nie odwrotnie to juz total wypas bd :)

1

Zamiast std::map możesz wykorzystać bibliotekę standardową: std::priority_queue, chociaż może to tak na prawdę być bardziej skomplikowane. Żeby zmienić kolejność w std::map zmień funkcję porównującą z domyślnej std::less na std::greater:

typedef map<int, pointer, greater<int> > stack;

http://www.cplusplus.com/reference/stl/priority_queue/

1

Tak tylko widzisz on napisal ze chce okreslac priorytet funkcji przy dodawaniu jej do "stosu", tak zeby te z wyzszym/nizszym wykonywane byly pierwsze. Tutaj musialby zrobic kolejke par, zeby w jakis sposob okreslic sobie ten priorytet, bo z samego adresu funkcji to duzo nie zrobi ;p

@Dubler
A pomyslales o wypisaniu takiej mapy od konca? Najwieksze elementy beda na koncu tak?

0

największe elementy? nie rozumiem tego sformowania w odniesieniu do funkcji. Chce aby można było dodawać wykonywanie poszczególnych funkcji z różnych klas/namespaceów z argumentami i odpowiednim priorytetem.
Im większy priorytet tym większe "pierwszeństwo" wykonywania funkcji.
np:
foo1(int a)//priorytet 14
foo2(int a)// priorytet 9
foo3(int a)// priorytet 999999
i ma się wykonać w kolejności 3, 1, 2

najlepiej żeby każda następna funkcja rozpoczynała wykonywanie się po zakończeniu poprzedniej :)
Bardzo dziękuje za zaangażowanie.

0

Z grubsza użyj kodu który podał @Krycho.
Użyj innego kontenera w zależności od potrzeb:

  • jeśli w kolejce ma nie być więcej niż jeden element o danym priorytecie to użyj mapę tak jak @Endrju sugeruje:
std::map<priorytet, funkcja, std::greater<priorytet> >
  • jeśli kolejka ma obsłużyć wiele elementów o tym samym priorytecie, lecz kolejność elementów o identycznym priorytecie jest nieistotna to użyj multimap:
std::multimap<priorytet, funkcja, std::greater<priorytet> >
  • jeśli kolejka ma obsłużyć wiele elementów o tym samym priorytecie, a kolejność elementów o identycznym priorytecie jest istotna to może mapa kolejek:
std::map< priorytet, std::queue<funkcja> >

albo samemu coś wykodzić. Jakoś nie przychodzi mi do głowy kontener przystosowany do tego celu, zwykle trzymają się zasady "strict weak ordering" co jest tu przeszkodą...

Alternatywnie zamiast map (drzewa) można używać wspomniany przez @Endrju, oparty o kopiec prioryty_queue tylko troszkę wtedy trzeba go dostroić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1