Mengen Klasse



  • Was hälst du von einer STL konformen Lösung, indem du einen Iterator für das Minimum/Maximum zurückgibst (oder zumindest einen Pointer darauf)? Damit hätten wir auch beide Diskussionspunkte zusammengeführt 😉

    class IntMenge
    {
       ...
    public:
       int const* getmaximum() const
       {
          if( true == empty() )
          {
             // kein Maximum
             return 0;
          }
          return (Adresse des Maximums);
       }
    };
    


  • Ist es nicht eher problematisch Pointer auf std::vector Elemente rauszugeben?
    Was wenn der std::vector intern seinen Buffer beim vergrößern verlagert? Dann stimmen doch die ganzen Pointer nicht mehr.



  • Ich jetzt? Nix 😉
    Wie gesagt, ich finde die ganze Funktion 'getMax' falsch, da Sie suggeriert, dass
    es immer ein Maximum geben müsste, was ja nicht der Fall ist.
    Ich würde wie oben das ganze find.. oder exists.. oder so nennen und bool zurückgeben und den Wert als Referenz.
    Jetzt hab ich mich aber auch ausreichend zu dem doch eher unwichtigen Punkt geäussert.



  • Wenn der Mathematiker das Minimum einer leeren Menge holt, ist der Beweis einfach kaputt. Er hätte sich aber mal fein einen Bleistift gewünscht, der ein geeignetes assert eingebaut hat, und zerbricht, wenn man so einen Unfug schreibt.
    Exceptions sind echt zu weich für echte Programmierfehler.



  • Der Mathematiker wird in Beweisen sehr oft nutzen, dass eine Menge kein Minimum hat.
    Insbesondere falls Mario sich überlegt seine Menge mal nicht mehr durch einen vector, sondern durch eine z.B. stetige Funktion zu representieren,
    ist die getMax-Funktion mit assert oder Exception schrott.



  • Jockelx schrieb:

    Der Mathematiker wird in Beweisen sehr oft nutzen, dass eine Menge kein Minimum hat.
    Insbesondere falls Mario sich überlegt seine Menge mal nicht mehr durch einen vector, sondern durch eine z.B. stetige Funktion zu representieren,
    ist die getMax-Funktion mit assert oder Exception schrott.

    Ich höre deine Worte, doch sie ergeben leider keinen Sinn.



  • blub² schrieb:

    Ist es nicht eher problematisch Pointer auf std::vector Elemente rauszugeben?
    Was wenn der std::vector intern seinen Buffer beim vergrößern verlagert? Dann stimmen doch die ganzen Pointer nicht mehr.

    Genaugenommen schon, und wenn der Vektor neuen Speicher anfordert stimmen die Adressen nicht mehr. Auf der anderen Seite machen die Iteratoren nichts anderes (möglicherweise wird´s aber ein Netz oder doppelten Boden geben, sodass sie nicht in´s Nirvana zeigen), sie werden ja ungültig, sobald Elemente aus dem Vektor entfernt oder hinzugefügt werden.
    Eine Lösung, die auch damit korrekt umgeht wäre dann ein Funktionspaar, das das Vorhandensein eines Minimums/Maximums anzeigt und eine, die das Minimum/Maximum dann zurückliefert. Gegen Funktionen mit Referenzen als Rückgabeparameter habe ich eine (unbegründete) Abneigung, allerdings käme man dann mit jeweils einer Funktion für das Minimum/Maximum aus.



  • if(m.istLeer())
       cout<<"Kein Maximum, weil die Menge leer ist!\n";
    else{
       tuwas(m.GetMaximum());
    }
    

    👍

    int* pi=m.GetMaximum();
    if(!pi)
       cout<<"Kein Maximum aus unbekanntem Grund!\n";
    else{
       tuwas(*pi);
    }
    

    👎



  • Wie wärs denn damit:

    .
    .
    .
    
    std::pair<int, bool> Menge::getMax()
    {
        int max = 0;
        bool hasMax = false;
        ...
        return std::pair<int, bool>(max, hasMax);
    }
    
    .
    .
    .
    


  • volkard schrieb:

    Ich höre deine Worte, doch sie ergeben leider keinen Sinn.

    Schade, dass sie für dich keinen Sinn ergeben.

    Sollte ein find("irgendwas") auf einen leeren String angewendet deiner Meinung nach eigentlich auch ein assert auslösen?



  • Jockelx schrieb:

    Sollte ein find("irgendwas") auf einen leeren String angewendet deiner Meinung nach eigentlich auch ein assert auslösen?

    ein find impliziert ja, dass es etwas zu suchen gibt und wer suchet der nicht findet. ergo muss find sagen können "nope, nix gefunden". Bei get sieht es anders aus. get heisst "gib mir" und da gibt es nur eine antwort: "da hast du".

    PS:
    die ganzen lösungen mit ungültigen werden, null zeigern, pair, etc. lenken alle von dem thema ab, dass getMax() einfach das maximum hergeben muss. getFoo gibt mir ein foo, getMax gibt mir ein max. da gibts keine alternative rückgabewerte. wäre alles nur workaround um ein design problem.



  • Jockelx schrieb:

    volkard schrieb:

    Ich höre deine Worte, doch sie ergeben leider keinen Sinn.

    Schade, dass sie für dich keinen Sinn ergeben.

    Sollte ein find("irgendwas") auf einen leeren String angewendet deiner Meinung nach eigentlich auch ein assert auslösen?

    Nein.
    Sollte ein .berechneDurchschnitt() auf einen leeren vector<double> eigentlich auch kein assert auslösen?



  • Shade Of Mine schrieb:

    Bei get sieht es anders aus. get heisst "gib mir" und da gibt es nur eine antwort: "da hast du".

    Ja, was bei Mengen aber nunmal nicht ansatzweise der Fall ist, dass man mir immer was geben könnte.
    Selbst wenn es hier bei dieser endlichen Menge nur den einen Fall gibt.

    Aber egal, jetzt geht es eh nur noch um Rechthaberei 😉

    Jockelx schrieb:

    Jetzt hab ich mich aber auch ausreichend zu dem doch eher unwichtigen Punkt geäussert.

    Sollte ein .berechneDurchschnitt() auf einen leeren vector<double> eigentlich auch kein assert auslösen?

    Doch, da im Gegensatz zu einer wohlfdefinierten leeren Menge der Durchschnitt von Nix nicht definiert ist.



  • Jockelx schrieb:

    Shade Of Mine schrieb:

    Bei get sieht es anders aus. get heisst "gib mir" und da gibt es nur eine antwort: "da hast du".

    Ja, was bei Mengen aber nunmal nicht ansatzweise der Fall ist, dass man mir immer was geben könnte.
    Selbst wenn es hier bei dieser endlichen Menge nur den einen Fall gibt.

    Problem gefunden.
    getMax() ist der falsche Name.

    Doch, da im Gegensatz zu einer wohlfdefinierten leeren Menge der Durchschnitt von Nix nicht definiert ist.

    was ist das maximum einer leeren menge?
    wenn es zB 7 ist, dann kann getMax ja 7 zurück geben...

    PS:
    das ist ein wichtiges thema - denn wie man hier sieht werden die leute sehr kreativ sich rückgabewerte und lustige signaturen auszudenken anstatt das problem dort zu behandeln wo es aufgetreten ist...



  • Jockelx schrieb:

    Doch, da im Gegensatz zu einer wohlfdefinierten leeren Menge der Durchschnitt von Nix nicht definiert ist.

    Das Maximum einer leeren Menge ist doch auch nicht definiert.



  • Shade Of Mine schrieb:

    Problem gefunden.
    getMax() ist der falsche Name.

    Jup.



  • Problem gefunden.
    getMax() ist der falsche Name.

    Das hab ich jetzt schon mehrfach gesagt 😉
    Ich sehe halt den Begriff 'allgemeine Menge' und die anderen wohl eher den Begriff 'endliche, diskrete Menge'.
    Letztere hat natürlich ausser im Fall der leeren Menge ein Maximum.

    Das Maximum einer leeren Menge ist doch auch nicht definiert.

    Es ist aber doch klar definiert, welche Mengen überhaupt ein Maximum bzw. keins haben und das sind nunmal jeweils unendlich viele (zumindest allgemein).



  • Jockelx schrieb:

    Problem gefunden.
    getMax() ist der falsche Name.

    Das hab ich jetzt schon mehrfach gesagt 😉
    Ich sehe halt den Begriff 'allgemeine Menge' und die anderen wohl eher den Begriff 'endliche, diskrete Menge'.

    Nope. Ich sehe findMax, searchMax, getMax, calcMax und so.
    getMax kann nicht nichts zurückgeben. Wenn Du nichts zurückgeben können willst, nenn es so wie es üblich ist, wenn man nichts zurückgeben können will.



  • Eine allgemeine (geordnete) Menge dürfte kein getMax haben. Aber wir betrachten hier ja keine allgemeine Menge, sondern nur endliche Mengen, eigentlich einen Container.
    Da ist getMax IMO vergleichbar mit top bei einem Stack oder head bei einer Liste. Eine Operation, die nur erlaubt ist, wenn es mindestens ein Element gibt.


Anmelden zum Antworten