Kolejka priorytetowa - dlaczego nie działa?

0
#include <iostream>
#include <queue>

using namespace std;

class Osoba
{
public:
	Osoba(int w) : wiek(w){}
	int wiek;
};

class PorownajOsoby
{
public:
	bool operator()(const Osoba & osoba1, const Osoba & osoba2)
	{
		if (osoba1.wiek > osoba2.wiek)
			return true;
		else
			return false;
	}
};

int main()
{
	priority_queue < Osoba*, vector < Osoba* >, PorownajOsoby > kolejkaPriorytetowa;
	for (int i = 0; i < 20; i++)
		kolejkaPriorytetowa.push(new Osoba(rand()%100));
	system("pause");
	return 0;
} 

Dlaczego mi tu nie działa kolejka priorytetowa? Wszystko robię tak jak na cp0x - http://cpp0x.pl/kursy/Kurs-STL-C++/Adapter-kolejki-priorytetowej-std-priority_queue/118

Wywala mi błąd: Severity Code Description Project File Line Suppression State
Error C2664 'bool PorownajOsoby::operator ()(const Osoba &,const Osoba &)': cannot convert argument 1 from 'Osoba *' to 'const Osoba &' Kolejka priorytetowa c:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility 735

1
    bool operator()(const Osoba * osoba1, const Osoba * osoba2)
    {
        if (osoba1->wiek > osoba2->wiek)
 

wyswietlanie

       while(!kolejkaPriorytetowa.empty()){
                cout << kolejkaPriorytetowa.top()->wiek << endl;
                kolejkaPriorytetowa.pop();
        }
 
0

Dzięki. A jak wyświetlić taką kolejkę priorytetową bez jej niszczenia?

1

Chyba się nie da, ale może ktoś zna i poda jakiś magiczny sposób? ;)

3

Container c jest wewnętrznym kontenerem queue i priority_queue, z dostępem protected. Wobec tego są to jedne z niewielu klas kontenerów w bibliotece standardowej, po których założone jest ewentualne dziedziczenie, np:

class KolejkaWskaznikowNaOsobe:
		public priority_queue<Osoba*, vector<Osoba*>, PorownajOsoby>
{
public:
	using parent = priority_queue<Osoba*, vector<Osoba*>, PorownajOsoby>;
	using parent::parent;

	auto& raw_container() { return c; }
	auto const& raw_container() const { return c; }
};

http://melpon.org/wandbox/permlink/YNQnDfNxM6AJJdIr

Przy czym jeśli tego potrzebujesz to zastanów się czy na pewno używasz dobrego typu danych.

Aha, i jeśli już przy tym jesteśmy: używanie nagiego new i delete to antyidiom w C++, masz kontenery (nawet z nich korzystasz tutaj), masz mądre wskaźniki. Po co się męczyć i pisać gorszy kod?

0
#include <iostream>
#include <queue> 
using namespace std;
 
class Person
  {
   unsigned age; // int na wiek? słyszałeś o ujemnym wieku? Powinna być prywatną
   public:
   Person(unsigned age):age(age){}
   bool operator<(const Person &p)const { return age>p.age; } // Po kiego porównanie na zewnątrz o ile można wewnątrz?
   friend ostream &operator<<(ostream &s,const Person &p) { return s<<p.age; }
  };
 
int main()
  {
   priority_queue<Person,vector<Person>> Q; // poprawniej przez wartości (w tym przypadku)
   Q.push(Person(15));
   Q.push(Person(16));
   Q.push(Person(14));
   Q.push(Person(17));
   Q.push(Person(13));
   cout<<Q.top()<<endl;
   return 0;
  }

Nie da się przejrzeć bez niszczenia, ponieważ kolejka priorytetowa nie musi trzymać elementy w postaci posortowanej.
Ale możesz zrobić jej kopię, po czym kopię zniszczyć dla wyświetlenia, z tym że jeżeli tego potrzebujesz to nie potrzebujesz kolejki priorytetowej.

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