🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #12302

Re: C++ functieobjecten als comparator in STL

#12302
From: Roel Schroeven
Date: Sat, 08 Dec 2001 10:20
58 lines
3898 bytes
On Sat, 08 Dec 2001 10:19:07 +0100, Goethals Frederik wrote:

> Elk Event (dus ook de afgeleide events) hebben een 'int time' als
> protected member en een public 'int geefTime() const {return time; }'
> als methode. Nu wou ik dus de Event* vergelijken en had bij constructie
> van de priority_queue het volgende gedaan:  priority_queue <Event*,
> deque<Event*>, less<Event*> > p;
> 
> ik heb dan in elke afgeleide klassen de operator< (....)
> geimplementeerd. (heb dan ook telkens wanneer hij event* vergelijkt een
> cout << "vgl" bijgezt als controle) Maar het probleem is dus dat hij
> nooit in de functie operator< (...) komt en dus geen "vgl" uitprint.

Voor het geval je het nog niet doorhad, even uitleggen waarom dat niet
werkt: STL vergelijkt de elementen die in de priority_queue staan, en dat
zijn de pointers zelf in plaats van de objecten waar ze naar wijzen.

> Nu
> heb ik al enige raad en info gehad van de assistent (ben namelijk
> student aan de unief en we moeten allen dat project proberen maken) dat
> daar de fout zit en dat ik zelf een functieobject moet implementeren dat
> twee 'event*' vergelijk en dan megeven als comparator obejct aan de
> queue.

Hij heeft gelijk ;)

> Nu komt dus de vraag: hoe moet ik die functie implementeren en wat is de
> syntax van die functie en waar moet die staan (in klasse event, afgelide
> klassen, erbuit, apart file ....?) ik weet het dus echt niet en het is
> het enige die niet werkt van mijn project.

Je moet een functie-object maken dat twee Event* als input neemt, en een
bool teruggeeft. Zulke functie-objecten leidt je best af van het
functie-object binary-function (in <functional>).
Een voorbeeldje dat ik gehaald heb van
http://www.sgi.com/tech/stl/functors.html, om twee doubles te
vergelijken:

 struct less_mag : public binary_function<double, double, bool> {
	bool operator()(double x, double y) { return fabs(x) < fabs(y); }
    };

Bij zal je die double moeten vervangen door Event*, en hoe die te
vergelijken kan je zelf wel uitvissen ;)

Waar die te zetten... ik zou dat zetten in de header file waar Event
gedefinieerd is, maar buiten die klasse (erna, best).

Nog een opmerking: je zegt dat je operator< geimplementeerd hebt in alle
afgeleide klassen, maar ik denk dat het genoeg is als je dat in de
basisklasse doet, zeker als je de vergelijking doet op basis van
geefTime(), die is toch voor alle afgeleide klassen hetzelfde als ik me
niet vergis.

Nog iets... ik ken dit ook allemaal niet zo goed van buiten, ik moet ook
altijd teruggrijpen naar de documentatie (The C++ Programming Language
van Bjarne Stroustrup himself, in dit geval; een aanrader als je het
onderste uit de kan wil halen qua C++).
Technical Details
Message-ID: <pan.2001.12.08.11.20.09.51.957@sneakemail.com>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!supernews.com!news.tele.dk!small.news.tele.dk!195.158.233.21!news1.ebone.net!news.ebone.net!skynet.be!skynet.be!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mail
References: <3c11dae3$0$27949$ba620e4c@news.skynet.be>

Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit
X-Google-Thread: fcea4,fc347145cf14adb4
X-Google-Attributes: gidfcea4,public
X-Google-ArrivalTime: 2001-12-08 02:20:11 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!supernews.com!news.tele.dk!small.news.tele.dk!195.158.233.21!news1.ebone.net!news.ebone.net!skynet.be!skynet.be!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mail
From: "Roel Schroeven" <x3jmyi0yrrn3h001@sneakemail.com>
Subject: Re: C++ functieobjecten als comparator in STL
Newsgroups: be.comp.programming
Message-ID: <pan.2001.12.08.11.20.09.51.957@sneakemail.com>
References: <3c11dae3$0$27949$ba620e4c@news.skynet.be>
User-Agent: Pan/0.10.0.93 (Unix)
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
X-Comment-To: "Goethals Frederik" <frederik.goethals@belgacom.net>
Lines: 58
Date: Sat, 08 Dec 2001 10:20:09 GMT
NNTP-Posting-Host: 213.224.75.182
X-Complaints-To: abuse@pandora.be
X-Trace: afrodite.telenet-ops.be 1007806809 213.224.75.182 (Sat, 08 Dec 2001 11:20:09 MET)
NNTP-Posting-Date: Sat, 08 Dec 2001 11:20:09 MET
Organization: Telenet Internet