Fragen zum std::sort



  • cartel schrieb:

    der Sig Fault unterläuft mir immer noch. Wenn ich die Zeile mit dem sortieren rausnehmen, läuft alles durch habe ich grade gemerkt 😕

    die Klasse bild ist über alle Zweifel erhaben? Kopieren usw. macht alles keine Probleme(tm), getPixel ist const ?
    Versuch mal ein capture per Referenz, also [&bild] statt [=] in dem Lambda.




  • Mod

    Zeig mal die Member der Bildklasse; die Funktionen getPixel, getWidth, getHeight; sowie eventuelle spezielle Memberfunktionen (Konstruktoren, Destruktor, Zuweisungsoperator), sofern vorhanden. Außerdem den Aufruf von holeBestePaar, inklusive allem was für die Erstellung des Bildobjektes relevant ist, auf dem die Funktion arbeitet.

    volkard schrieb:

    Mein Fehler.
    [&] statt [=]
    http://www.cprogramming.com/c++11/c++11-lambda-closures.html

    Das sollte aber doch bei einer Bildklasse mit sinnvoll definiertem Kopierkonstruktor trotzdem funktionieren, bloß elend langsam.



  • Ich würde sagen:
    Der Konstruktor hat new[] drin.
    Der Destruktor hat delete[] drin.
    Kopierkonstruktor und Zuweisungsoperator fehlen.
    Verstoß gegen http://de.wikipedia.org/wiki/Dreierregel_(C%2B%2B)

    Beste Lösung vermutlich: Kopierkonstruktor und Zuweisungsoperator private machen oder besser mit =delete wegmachen.



  • Hey,

    Also das mit dem [&bild] hat jetzt funktioniert. Was bedeutet denn genau dieses "lambda". Die Bildklasse hab ich leider nicht selbst geschrieben und darf sie leider auch nicht verändern (kennt der ein oder anderen hier bestimmt 😉 ).

    Euch zwei vieelen Dank für die schnelle Hilfe. Hat mich echt sehr viel weiter gebracht



  • Jetzt vermute ich mal ganz frech, daß Du kein C++11 in der Lösung verwenden darfst. 💡



  • Zum Glück darf ich in der Lösung c++11 verwenden. Müssen wir sogar, da wir noch mit Threads arbeiten sollen und es da ein Interface dazu gibt 😃
    Einmal glück gehabt, aber hätte gut sein können, du scheinst dich auszukennen 😉

    Mal so interessehalber, wie wäre man ohne c++11 weitergekommen?



  • cartel schrieb:

    Mal so interessehalber, wie wäre man ohne c++11 weitergekommen?

    Z.B. ein Funktionsobjekt basteln:

    struct compare_by_pixelvalue{
      typedef Paar first_argument_type;
      typedef Paar second_argument_type;
      typedef bool result_type;
      const bild* b;
      compare_by_pixelvalue(const bild& b) : b(&b){}
      bool operator()(const Paar& x, const Paar& y) const {
        return b->getPixel(x.first, x.second) < b->getPixel(y.first, y.second);
      }
    };
    
    void f(){
      bild b; 
      PaarListe paare;
      // ....
      std::sort(paare.begin(), paare.end(), compare_by_pixelvalue(b));
    }
    


  • Ich würde die typedefs noch weglassen und das Bild als const& halten.
    Kommt da einegntlich das selbe Compilat raus? Also werden lamdas geinlined?
    übrigens > statt <, denke, er wollte die größten Werte vorne.



  • volkard schrieb:

    Ich würde die typedefs noch weglassen und das Bild als const& halten.
    [...]
    übrigens > statt <, denke, er wollte die größten Werte vorne.

    Danke für die nette Vorlage...
    Jetzt kommt die große Stunde der typedefs 😉

    std::sort(paare.begin(), paare.end(), std::not2(compare_by_pixelvalue(b)));
    

    Referenzen als Member sind wohl nicht ganz unumstritten. Und da ich mir keinen Zacken aus der Krone breche und die Standardbibliothek es auch so macht bin ich jetzt in der Pointer-Member Fraktion...



  • Furble Wurble schrieb:

    volkard schrieb:

    Ich würde die typedefs noch weglassen und das Bild als const& halten.
    [...]
    übrigens > statt <, denke, er wollte die größten Werte vorne.

    Danke für die nette Vorlage...
    Jetzt kommt die große Stunde der typedefs 😉

    std::sort(paare.begin(), paare.end(), std::not2(compare_by_pixelvalue(b)));
    

    Ist das noch eine "Strict weak ordering"?



  • volkard schrieb:

    Ich würde die typedefs noch weglassen und das Bild als const& halten.

    Würdest du den Funktor dann auch non-assignable machen?


Anmelden zum Antworten