Frage(n) zu C++ STL

Hallo C++ - Spezialisten,

ich beschäftige mich zur Zeit mit der STL, aber zu einigen Sachen finde ich keine Erklärungen:

  • Angenommen ich habe eine Klasse „testclass“, die einfach ein int i speichern und zurückgeben kann. Außerdem ist der "testclass::operatorget_i();
    }Und weiter angenommen, ich habe einen Vektor von testclass*:

    vector s;

Gibt es dann eine Möglichkeit, diesen Vektor mittels sort() zu sortieren?

sort(s.begin(), s.end());

funktioniert ja nicht, da s.begin() im Prinzip nur einen Zeiger zurückgibt, der nochmals dereferenziert werden müsste. Funktioniert das in diesem Fall tatsächlich nur mit einer zusätzlichen Vergleichsfunktion?

sort(s.begin(), s.end(), testclass::cmp);

Das würde ja den Sinn der Operatorüberladung zunichte machen…

  • Kann ich sort() auch auf Listen anwenden? Mein Compiler liefert mir nur Fehler zurück, und ich vermute deshalb, weil es für Listen keine Iteratoren mit wahlfreiem Zugriff gibt. Ist diese Annahme korrekt?

Gruß
Chondron

Hallo,

Funktioniert das in diesem Fall
tatsächlich nur mit einer zusätzlichen Vergleichsfunktion?

sort(s.begin(), s.end(), testclass::cmp);

Das würde
ja den Sinn der Operatorüberladung zunichte machen…

Das sollte wohl funktionieren (hab nicht so viel Erfahrung mit STL), und es macht den Sinn nicht zunichte. Schliesslich kannst du es noch an anderen Stellen im Quellcode sinnvoll benutzen.

Oder wie wuerdest du eine sort()-Funktion implementieren, der man einen beliebigen ueberladenen Operator uebergeben kann, der zum Sortieren auf das Objekt angewandt wird?

Gruesse,
Moritz

Hi,

Oder wie wuerdest du eine sort()-Funktion implementieren, der
man einen beliebigen ueberladenen Operator uebergeben kann,
der zum Sortieren auf das Objekt angewandt wird?

Der Sinn der Operatorüberladung ist mir schon klar, ich wüsste nur, unter welchen Bedingungen ich sie überhaupt für die sort()-Funktion nutzen kann? Irgendwie muss es ja gehen…

Gruß
Chondron

Hiho

Oder wie wuerdest du eine sort()-Funktion implementieren, der
man einen beliebigen ueberladenen Operator uebergeben kann,
der zum Sortieren auf das Objekt angewandt wird?

Der Sinn der Operatorüberladung ist mir schon klar, ich wüsste
nur, unter welchen Bedingungen ich sie überhaupt für die
sort()-Funktion nutzen kann? Irgendwie muss es ja gehen…

(um mal was zu zitieren:smile: *setzt Lesebrille auf*

#include 
#include 
#include 

class Foo
{
public:
 Foo (int x)
 : x (x)
 {

 }

 bool
 operatorx x;
 }

//private:
 int x;
};

int
main (int argc, char\* argv[])
{
 std::vector n;

 n.push\_back (new Foo (5));
 n.push\_back (new Foo (10));
 n.push\_back (new Foo (1));

 std::sort (n.begin (), n.end (), std::mem\_fun (&Foo::operator::iterator it = n.begin ();
 while (it != n.end ())
 {
 Foo\* m = (\*it);
 std::cout x 

Ist das sowas, was du suchts?!

mfg TLF

Hallo Chondron,

Gibt es dann eine
Möglichkeit, diesen Vektor mittels sort() zu sortieren?

sort(s.begin(), s.end());

funktioniert ja nicht, da
s.begin() im Prinzip nur einen Zeiger zurückgibt, der nochmals
dereferenziert werden müsste. Funktioniert das in diesem Fall
tatsächlich nur mit einer zusätzlichen Vergleichsfunktion?

sort(s.begin(), s.end(), testclass::cmp);

Das würde
ja den Sinn der Operatorüberladung zunichte machen…

In Deinem Fall soweit ich weiß ja, da Du nicht Elemente vom Typ ‚testclass‘ vergleichst sondern vom Typ ‚testclass*‘.
Was geht ist

vector s;
sort(s.begin(), s.end());

Dabei sind die Elemente der Liste ‚s‘ vom Typ ‚testclass‘, die können sortiert werden (dafür hast Du das 'operator
static bool testclass::comp_p(testclass* t1, testclass* t2)
{ return *t1
und dann

vector s;
sort(s.begin(), s.end(), &testclass::comp\_p);
  • Kann ich sort() auch auf Listen anwenden? Mein Compiler
    liefert mir nur Fehler zurück, und ich vermute deshalb, weil
    es für Listen keine Iteratoren mit wahlfreiem Zugriff gibt.
    Ist diese Annahme korrekt?

Ich denke das Gleiche.
Für Listen hast Du aber schon eine sort-Funktion, siehe http://www.sgi.com/tech/stl/List.html unterste Funktion. Damit kannst Du dann

list s;
s.sort(&testclass::comp\_p);

verwenden.

Gruß
Diether