PDA

Ver la Versión Completa : Trabajo con cola con prioridad


oracle
20-02-2007, 15:05:42
Saludos estimada comunidad:

Mi problema es el siguiente:
Estoy haciendo un pequeño programa en C++ (Builder 6) y necesito utilizar colas con prioridad, pero quisiera hacerlo sin tener que implementar una. He buscado en la ayuda del Builder y hay una clase para resolver estos problemas, pero la cosa está en que no sé qué parámetros ni como pasárselos para que tome la prioridad....la clase es esta:

priority_queue<_Tp,_Sequence,_Compare>

_Tp claramente es el dato que se desea almacenar, pero los otros dos ni modo que entienda para que son....

Saludos y mil gracias de antemano.....

Oracle

wako13
20-02-2007, 19:03:05
En la ayuda del Builder 6 encontré lo siguiente:

Example

//
// p_queue.cpp
//
#include <queue>
#include <deque>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(void)
{
// Make a priority queue of int using a vector container
priority_queue<int, vector<int>, less<int> > pq;

// Push a couple of values
pq.push(1);
pq.push(2);
// Pop a couple of values and examine the ends
cout << pq.top() << endl;
pq.pop();
cout << pq.top() << endl;

pq.pop();
// Make a priority queue of strings using
// a deque container
priority_queue<string, deque<string>, less<string> >
pqs;
// Push on a few strings then pop them back off
int i;
for (i = 0; i < 10; i++)
{
pqs.push(string(i+1,'a'));
cout << pqs.top() << endl;
}
for (i = 0; i < 10; i++)
{
cout << pqs.top() << endl;
pqs.pop();
}
// Make a priority queue of strings using a deque

// container, and greater as the compare operation
priority_queue<string,deque<string>, greater<string> >
pgqs;
// Push on a few strings then pop them back off
for (i = 0; i < 10; i++)
{
pgqs.push(string(i+1,'a'));
cout << pgqs.top() << endl;
}
for (i = 0; i < 10; i++)
{
cout << pgqs.top() << endl;
pgqs.pop();
}
return 0;
}

Program Output

2
1
a
aa
aaa
aaaa
aaaaa
aaaaaa
aaaaaaa
aaaaaaaa
aaaaaaaaa
aaaaaaaaaa
aaaaaaaaa
aaaaaaaa
aaaaaaa
aaaaaa
aaaaa
aaaa
aaa
aa
a
a
a
a
a
a
a
a
a
a
a
a
aa
aaa
aaaa
aaaaa
aaaaaa
aaaaaaa
aaaaaaaa
aaaaaaaaa
aaaaaaaaaa

Espero te sirva...

Saludos Cordiales

oracle
20-02-2007, 19:43:02
Bueno, yo efectivamente consulte la ayuda del Builder antes de poner el post, y vi ese ejemplo precisamente, pero la idea que no lo entiendo del todo:

Por ejemplo dejame plantear una pequeña situacion a ver si me ayudas con lo que quiero:

tenemos la definicion de una clase X en algun lugar, y esta tiene por ejmplo un metodo Y() que calcula cierto numero a partir de los atributos de la clase X y lo devuelve como un entero.

Ahora yo quiero almacenar objetos de tipo X en una cola con prioridad ordenada ascendentemento por lo valores que devuelve el metodo Y(), entonces es ahi donde no se como delcrar la Cola, o sea me quedaria algo mas o menos asi, pero que pongo en el segundo y tercer argumento de la declaracion?????

priority_queue<X,???,???>

Saludos y espero me haya explicado mejor.........

oracle
22-02-2007, 00:04:58
He encontrado este ejemplo y creo que está bastante descriptivo, pero todavía hay algo que no entiendo, y es ¿cómo sabe la cola que tiene que ordenar por el parámetro "distance", si en ningún lugar veo la especificación de eso?

El ejemplo es el siguiente:


#include <string>

class Destination {
unsigned int distance; string destination;
friend ostream& operator<<(ostream &, const Destination &) ;
public:

Destination (const string dt, unsigned int ds)
: distance(ds), destination(dt) {}

bool operator< (const Destination & right) const {
return distance < right.distance;
}
};
ostream & operator << (ostream& os, const Destination & p) {
return os << p.destination << " " << p.distance ;
}
int main() {
// keep a priority queue of distances to cities
priority_queue < Destination > que;
que.push(Destination("halifax", 0));
que.push(Destination("truro", 100));
que.push(Destination("moncton", 230));

while (! que.empty() ) { // remove top entry from queue
cout << que.top() << endl;
que.pop();
}
}
/* output
moncton 230
truro 100
halifax 0
*/


Saludos

Oracle

oracle
22-02-2007, 04:05:55
Ya lo solucione, la cosa esta en la sobrecarga del operador <


bool operator< (const Destination & right) const {
return distance < right.distance;
}


Saludos