Maximum aus Integer finden.



  • http://www.cplusplus.com/reference/algorithm/

    Da hat es auch Beispiele mit Funktoren. Sind im Prinzip ganz einfach.

    Also um eine Suche wirst du nicht herum kommen. Du hast eine Reihe von Daten, von denen du das Maximum rausfinden musst. Du kannst natürlich auch einen Funktore schreiben, der anstatt Zeiger Instanzen von Spielern nimmt und dann selbst die Grösse abfrägt und einen Zeiger auf den Spieler zurückgibt.



  • sust schrieb:

    Nun möchte ich mir den Spieler mit dem höchsten Kontostand raussuchen. Muss ich mir in der Klasse Player nun eine Methode erzeugen welche mir den Kontostand als Pointer zurückgibt um mit euren Lösungsvorschlägen arbeiten zu können oder gibt es vielleicht eine weniger umständliche Lösung ? 😋

    Ein Pointer ist dafür nicht nötig. Was wahrscheinlich das Beste wäre, ist ein STL-Container (je nach Bedürfnissen ein sequenzieller, oder wenn du gerade eine automatische Sortierung willst, ein assoziativer). Als Vergleichskriterium benötigst du einen Funktor (=Funktionsobjekt) oder einen Funktionszeiger, wobei ich zu ersterem rate, da der flexibler ist.



  • irgendwie komm ich noch nicht ganz drauf...

    Meine Überlegung ist erstmal mir einen vector von meinen player Objekten anzulegen.
    Dann müsste ich allerdings einen funktor erstellen welcher die jeweils zu vergleichende Objekte übergeben bekommt und von diesen dann die Methode getKonto() aufruft. Der Rückgabewert von getKonto muss im Funktor dann verglichen werden und als parameter an meinen "max_element" algo. zurückgegeben werden.

    falls mein niedergetextetes Wirrwarr im Kopf für irgendjemand verständlich ist:
    Ist dies von der Theorie her richtig / möglich und kann mir jemand bei dem funktor helfen ? 🙂
    danke ! LG



  • Ja, wenn ich dich richtig verstehe, ist das richtig 😃 Du brauchst allerdings nicht unbedingt einen Funktor (also ein Objekt einer Klasse, für die der Funktionsaufruf-Operator überladen ist), sondern in deinem Fall sollte es auch eine einfache Funktion tun, also sowas wie

    bool ComparePlayersByKonto(Player const &lhs, Player const &rhs)
    {
        return lhs.getKonto() < rhs.getKonto();
    }
    

    Felix



  • vieeeeelen dank an alle : )
    ganz besonders dem felix 😃

    habs jetz erstmal soweit dass es wenigstens funktioniert:

    bool compareKonto(player *lhs, player *rhs)
    {
      return lhs->getKonto() < rhs->getKonto();
    }
    
    void gamehandler::run()
    {
      vector<player*> playerVec;
    
      playerVec.push_back(&Red);
      playerVec.push_back(&Purple);
      playerVec.push_back(&Blue);
      playerVec.push_back(&Yellow);
    
      vector<player*>::const_iterator max = max_element(playerVec.begin(), playerVec.end(), compareKonto);
      cout << *max->getKonto() << endl;  //funktioniert nicht
      playerVec.push_back(*max);
      cout << playerVec[4]->getKonto() << endl;  //funktioniert
    }
    

    Der iterator max ist doch ein Zeiger der mir nun auf das Maximum zeigt. Warum kann ich nicht wie oben versucht direkt mithilfe des iterators getKonto aufrufen ?
    Speichere ich das Objekt auf welches der Iterator zeigt zuerst wieder in den Vector und geben dann erst den Kontostand aus funktioniert es. *verständnisproblem*



  • cout << (*max)->getKonto() << endl;
    


  • simon.gysi schrieb:

    cout << (*max)->getKonto() << endl;
    

    Was mich gerade wieder daran erinnert das ich ziemlich froh bin das sowas nicht geht:

    cout << max->->getKonto() << endl;
    

    oder nur

    cout << max-->getKonto() << endl;
    

    Ich glaube dann wäre ich noch früher fällig für die Rente. 😉



  • Fellhuhn schrieb:

    simon.gysi schrieb:

    cout << (*max)->getKonto() << endl;
    

    Was mich gerade wieder daran erinnert das ich ziemlich froh bin das sowas nicht geht:

    cout << max->->getKonto() << endl;
    

    oder nur

    cout << max-->getKonto() << endl;
    

    Ich glaube dann wäre ich noch früher fällig für die Rente. 😉

    Das hier wäre aber ohne Probleme möglich gewesen. 🙂

    cout << max->getKonto() << endl;
    

    Obwohl das hier:

    max-->getKonto()
    

    Auch ohne weiters möglich ist. :p

    int getKonto ()
    {
        return 2;
    }
    ...
    int max = 5;
    cout << (max-->getKonto()) << endl;
    

    Was gibt das wohl aus? 😃



  • Nichts, da boolsche Werte per Default nicht ausgegeben werden. 😉



  • drakon schrieb:

    Das hier wäre aber ohne Probleme möglich gewesen. 🙂

    cout << max->getKonto() << endl;
    

    hm in meinem fall leider nicht ^^

    Danke allen, funktioniert nun endlich.
    Wie kompliziert manche scheinbar so trivialen Dinge sein können, wobei sich die Lösung sobald man sie gefunden hat doch wieder als relativ primitiv herausstellt 😃



  • sust schrieb:

    Wie kompliziert manche scheinbar so trivialen Dinge sein können, wobei sich die Lösung sobald man sie gefunden hat doch wieder als relativ primitiv herausstellt 😃

    Einen Kaffee auf chinesisch zu bestellen ist auch nur nicht trivial, wenn man kein Chinesisch kann. 😉



  • aber ich kanns ja.. "eigentlich" 😞



  • Wenn es beim Nachbestellen der Sahne hapert, weil man es noch nie brauchte, schlägt man halt nach wie es heißt (oder fragt eben hier). 😉


Anmelden zum Antworten