Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

set<>: Beispiel gesucht

22 views
Skip to first unread message

Gregor Szaktilla

unread,
Feb 21, 2012, 7:41:29 AM2/21/12
to
Hallo zusammen!

Ich beschäftige mich seit gestern mit der Deklaration eines set<> und komme
nicht auf den richtigen Dreh.

Meinem Verständis nach erhält die Deklaration eines set<> optional eine
Funktion, die zwei Elemente des sets auf größer/kleiner prüft.

Der Compiler (g++ 4.irgendwas) wirft mir aber immer irgendeine
Fehlermeldung vor, die mir zu verstehen gibt, dass ich das noch nicht
kapiert habe.

Beispiel für die Deklaration (in main.cc):

set<thing, sortThing> things;


In main.hh die Definition von sortThing:

bool sortThing(thing _a, thing _b)
{
if (_a.getX()<_b.getX())
{ return(true); }
else
{ return(false); }
}


In diesem Fall bekomme ich
error: expected a type, got ‘sortThing’
zu lesen.

Nunja ... kennt jemand ein gutes Beispiel für die korrekte Anwendung von
set<> mit allem Pipapo? Wegen meines Umzugs komme ich blöderweise gerade
nicht an die Bücher, die mir hierbei wahrscheinlich helfen würden.


TIA

Gregor

--
Werbeagenturen sind üblicherweise miserable Arbeitgeber. Kirchen ebenso.

Daniel Krügler

unread,
Feb 21, 2012, 12:48:08 PM2/21/12
to
On 21 Feb., 13:41, Gregor Szaktilla <spam...@ktilla.de> wrote:
> Hallo zusammen!
>
> Ich beschäftige mich seit gestern mit der Deklaration eines set<> und komme
>   nicht auf den richtigen Dreh.
>
> Meinem Verständis nach erhält die Deklaration eines set<> optional eine
> Funktion, die zwei Elemente des sets auf größer/kleiner prüft.
>
> Der Compiler (g++ 4.irgendwas) wirft mir aber immer irgendeine
> Fehlermeldung vor, die mir zu verstehen gibt, dass ich das noch nicht
> kapiert habe.
>
> Beispiel für die Deklaration (in main.cc):
>
>    set<thing, sortThing> things;
>
> In main.hh die Definition von sortThing:
>
>    bool sortThing(thing _a, thing _b)
>      {
>        if (_a.getX()<_b.getX())
>          { return(true); }
>        else
>          { return(false); }
>      }
>
> In diesem Fall bekomme ich
>   error:   expected a type, got ‘sortThing’
> zu lesen.

Eigentlich sagt der Compiler sogar genau, was er will - Er will einen
Typ,
du gibst ihm aber keinen;-)

std::set erwartet als zweites Template-Argument den *Typ* eines
Vergleich-Funktionsobjektes. Dies muss ein Objekttyp sein.

Wenn du also deine Funktion sortThing verwenden willst, ist der Typ
des
korrespondierenden Funktionsobjektes

bool(*)(thing, thing)

Das ist der Funktionszeigertyp, dem man deine Funktion zuweisen
kann.

Damit schreibst du dann schon mal

set<thing, bool(*)(thing, thing)> things;

Das ist aber noch nicht alles, da bei einem Funktionszeiger der Typ
nicht
ausreicht, um eine Funktion aufzurufen. Du musst also bei der
Konstruktion
des sets den Zeiger mitübergeben, also so:

set<thing, bool(*)(thing, thing)> things(sortThing);

Das sollte schon klappen. Ich persönlich ziehe es meistens vor, wenn
der Vergleichstyp auch direkt die Funktion mitliefert, dann muss ich
nicht
jedesmal bei der Konstruktion den Funktionszeiger angeben (Dies kann
allerdings auch vorteilhaft sein, weil man dynamisch die Ordnung
entscheiden
kann). Wenn dir eine statische Festlegung ausreicht, dann schreib dir
eine
einfache Vergleichsobjekt-Klasse, die man wie eine Funktion aufrufen
kann,
z.B. so:

struct MySortThing {
bool operator()(thing a, thing b) const { return sortThing(a, b); }
};

und definiere nun deinen Set so:

set<thing, MySortThing> things;

Jetzt ist der Typ MySortThing automatisch der Repäsentant für deine
Funktion und du brauchst bei der Konstruktion kein eigenes Objekt
anlegen (std::set verwendet ein default-konstruiertes Objekt deines
MySortThing).

Viel Erfolg und besten Gruss aus Bremen,

Daniel Krügler

Gregor Szaktilla

unread,
Feb 21, 2012, 2:42:08 PM2/21/12
to
Hallo Daniel,

vielen Dank für Deine Antwort!

Da sie auch syntaktische Dinge enthält, die ich noch nicht kenne, wundert
es mich nicht mehr, dass ich nicht selbst auf die Lösung gekommen bin.

Ich werde Deine Vorschläge einmal ausprobieren und in meiner kleinen
C++-Bibliothek nachlesen, sobald ich wieder an selbige kann. Umziehen wird
garantiert nie eines meiner Hobbys werden ...

Gruß

Gregor


--
Die Kunst des Ausruhens ist ein Teil der Kunst des Arbeitens. (John Steinbeck)
0 new messages