/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
C++ stl: priority_queue
Fra : Preben


Dato : 31-05-06 17:47

Hvad giver følgende:

std::priority_queue<Configuration*, std::vector<Configuration*>,
std::less<Configuration*> > pq;


Hvordan vil "priority_queue" anvende std::less<Configuration*> til
sammenligning.

Vil den sammenligne pointerne eller rent faktisk anvende "operator<" på
Configuration som objekt?


Mvh / Preben Holm

 
 
Preben (31-05-2006)
Kommentar
Fra : Preben


Dato : 31-05-06 19:37

> std::priority_queue<Configuration*, std::vector<Configuration*>,
> std::less<Configuration*> > pq;
>
>
> Hvordan vil "priority_queue" anvende std::less<Configuration*> til
> sammenligning.
>
> Vil den sammenligne pointerne eller rent faktisk anvende "operator<" på
> Configuration som objekt?


Og jeg er selvfølgelig interesseret i at vide hvordan jeg får den til at
virke som en "operator<" på selve objektet.

Jeg har implementeret en "operator<" på klasse Configuration:
---------------------------
bool Configuration:erator<(const Configuration& conf) const {
return (_shortest < conf.getShortest());
}
---------------------------

og håber det er rigtigt...

altså hvis (x < y), så skulle jeg gerne returnere true fra ovenstående
funktion!


Hvis jeg indsætter 10.002 elementer i pq, som alle er initialiseret som
følger:
---------------------------
for (unsigned int i = 0; i < G.size(); ++i) {
G[i]->setShortest(1000000000000.);
G[i]->setParent(NULL);
}
s->setShortest(0);
---------------------------


og så indsætter elementerne i køen:
---------------------------
std::priority_queue<Configuration*, std::vector<Configuration*>,
std::less<Configuration*> > pq;
// Fill the queue
for (unsigned int i = 0; i < G.size(); ++i) {
pq.push(G[i]);
}
---------------------------

og herefter kører nedenstående:
---------------------------
unsigned int t = 0;
if (pq.top() != s) {
std::cout << "Error: top element is not _source. Elements in
queue: " << pq.size() << std::endl;
while(!pq.empty()) {
Configuration* u = pq.top();
pq.pop();
++t;
if (u == s)
std::cout << "Dijkstra: Source found in number " << t <<
std::endl;
}
}
---------------------------


så fås flg. output:
---------------------------
Error: top element is not _source. Elements in queue: 10002
Dijkstra: Source found in number 9990
---------------------------

og det er jo ikke godt, når man skal implementere f.eks. Dijkstra's
algoritme (i mit tilfælde).


På forhånd mange tak.

Mvh / Preben

Bertel Brander (31-05-2006)
Kommentar
Fra : Bertel Brander


Dato : 31-05-06 21:35

Preben wrote:

>> std::priority_queue<Configuration*, std::vector<Configuration*>,
>> std::less<Configuration*> > pq;
>>
>>
>> Hvordan vil "priority_queue" anvende std::less<Configuration*> til
>> sammenligning.
>>
>> Vil den sammenligne pointerne eller rent faktisk anvende "operator<"
>> på Configuration som objekt?

Jeg har ikke arbejdet med priority_queue før, så følgende skal tages med
forbehold:

> Og jeg er selvfølgelig interesseret i at vide hvordan jeg får den til at
> virke som en "operator<" på selve objektet.
>
> Jeg har implementeret en "operator<" på klasse Configuration:
> ---------------------------
> bool Configuration:erator<(const Configuration& conf) const {
> return (_shortest < conf.getShortest());
> }
> ---------------------------
>
> og håber det er rigtigt...

Så vidt jeg kan se er du nødt til at lave:

class Compare
{
public:
bool operator () (const Configuration* aLhs, const Configuration* aRhs)
{
return ...;
}
};

Og oprette køen med:
std::priority_queue<Configuration*, std::vector<Configuration*>,
Compare > pq;

Jeg tror ikke du kan bruge std::less med pointere, det ville kræve
at du kunne lave en "bool operator <" der tager pointere, det kan man
vist ikke.

>
> altså hvis (x < y), så skulle jeg gerne returnere true fra ovenstående
> funktion!
>
>
> Hvis jeg indsætter 10.002 elementer i pq, som alle er initialiseret som
> følger:
> ---------------------------
> for (unsigned int i = 0; i < G.size(); ++i) {
> G[i]->setShortest(1000000000000.);
> G[i]->setParent(NULL);
> }
> s->setShortest(0);

Hvad er s, er det en pointer til et element i G[]?

> og så indsætter elementerne i køen:
> ---------------------------
> std::priority_queue<Configuration*, std::vector<Configuration*>,
> std::less<Configuration*> > pq;
> // Fill the queue
> for (unsigned int i = 0; i < G.size(); ++i) {
> pq.push(G[i]);
> }

Det er vist ikke ret effiktivt, den vil vel sortere hver gang
man indsætter et element. Jeg er heller ikke sikker på at det
er smart, da alle elementer har samme værdi?

> ---------------------------
>
> og herefter kører nedenstående:
> ---------------------------
> unsigned int t = 0;
> if (pq.top() != s) {
> std::cout << "Error: top element is not _source. Elements in
> queue: " << pq.size() << std::endl;
> while(!pq.empty()) {
> Configuration* u = pq.top();
> pq.pop();
> ++t;
> if (u == s)

Så vidt jeg kan se peger u på noget udefineret, når du har
pop'et.

> std::cout << "Dijkstra: Source found in number " << t <<
> std::endl;
> }
> }
> ---------------------------
>
>
> så fås flg. output:
> ---------------------------
> Error: top element is not _source. Elements in queue: 10002
> Dijkstra: Source found in number 9990
> ---------------------------
>
> og det er jo ikke godt, når man skal implementere f.eks. Dijkstra's
> algoritme (i mit tilfælde).

Jeg ved ikke hvad "Dijkstra's algoritme" er, måske skulle du forsøge
at forklare hvilket problem du forsøger at løse.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Mogens Hansen (31-05-2006)
Kommentar
Fra : Mogens Hansen


Dato : 31-05-06 21:45


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:447dfe08$0$186$edfadb0f@dread16.news.tele.dk...
> Preben wrote:

[8<8<8<]
>> unsigned int t = 0;
>> if (pq.top() != s) {
>> std::cout << "Error: top element is not _source. Elements in queue:
>> " << pq.size() << std::endl;
>> while(!pq.empty()) {
>> Configuration* u = pq.top();
>> pq.pop();
>> ++t;
>> if (u == s)
>
> Så vidt jeg kan se peger u på noget udefineret, når du har
> pop'et.

Nej, det tror jeg ikke.
Det er pointerens værdi der er lagret i containeren. Hvorvidt den peger på
noget udefineret er uafhængig af hvorvidt der ligger en kopi i en container
eller ej.

Venlig hilsen

Mogens Hansen



Bertel Brander (31-05-2006)
Kommentar
Fra : Bertel Brander


Dato : 31-05-06 21:56

Mogens Hansen wrote:
> "Bertel Brander" <bertel@post4.tele.dk> wrote in message
> news:447dfe08$0$186$edfadb0f@dread16.news.tele.dk...
>> Preben wrote:
>
> [8<8<8<]
>>> unsigned int t = 0;
>>> if (pq.top() != s) {
>>> std::cout << "Error: top element is not _source. Elements in queue:
>>> " << pq.size() << std::endl;
>>> while(!pq.empty()) {
>>> Configuration* u = pq.top();
>>> pq.pop();
>>> ++t;
>>> if (u == s)
>> Så vidt jeg kan se peger u på noget udefineret, når du har
>> pop'et.
>
> Nej, det tror jeg ikke.
> Det er pointerens værdi der er lagret i containeren. Hvorvidt den peger på
> noget udefineret er uafhængig af hvorvidt der ligger en kopi i en container
> eller ej.

Du har, som vanligt, ret.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Mogens Hansen (31-05-2006)
Kommentar
Fra : Mogens Hansen


Dato : 31-05-06 21:43


"Preben" <64bitNoNoNoSPAM@mailme.dk> wrote in message
news:447de200$0$15793$14726298@news.sunsite.dk...


[8<8<8<]
> og det er jo ikke godt, når man skal implementere f.eks. Dijkstra's
> algoritme (i mit tilfælde).

Nu har jeg ikke læst hele dit indlæg grundigt igennem - men prøv at tag et
kig på Boost::Graph:
http://www.boost.org/libs/graph/doc/table_of_contents.html

Venlig hilsen

Mogens Hansen



Mogens Hansen (31-05-2006)
Kommentar
Fra : Mogens Hansen


Dato : 31-05-06 21:07


"Preben" <64bitNoNoNoSPAM@mailme.dk> wrote in message
news:447dc843$0$15790$14726298@news.sunsite.dk...
> Hvad giver følgende:
>
> std::priority_queue<Configuration*, std::vector<Configuration*>,
> std::less<Configuration*> > pq;
>
>
> Hvordan vil "priority_queue" anvende std::less<Configuration*> til
> sammenligning.

Den vil, som udgangspunkt, bruge pointer værdien.

>
> Vil den sammenligne pointerne eller rent faktisk anvende "operator<" på
> Configuration som objekt?

Du kan lave din egen sammenlignings funktions objekt:

template <typename T>
struct less_ptr_value
{
bool operator(const T* t1, const T* t2)
{ return *t1 < *t2; } // assuming t1 != 0 and t2 != 0
};

som du bruger i stedet for less:
less_ptr_value<Configuration>

Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177429
Tips : 31962
Nyheder : 719565
Indlæg : 6407948
Brugere : 218878

Månedens bedste
Årets bedste
Sidste års bedste