Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Trabajo con cola con prioridad (https://www.clubdelphi.com/foros/showthread.php?t=40537)

oracle 20-02-2007 15:05:42

Trabajo con cola con prioridad
 
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:

Código:

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:

Código:

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?????

Código:

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:

Código:

#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 <

Código:


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

Saludos


La franja horaria es GMT +2. Ahora son las 02:43:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi