vector sortieren. logikfehler ?



  • Naja, sieh dir einfach die Dokumentation zu partial_sort an:
    http://www.cplusplus.com/reference/algorithm/partial_sort/

    Der erste und dritte Parameter grenzen den gesamten zu sortierenden Bereich ein (hier den gesamten vector), der erste und zweite geben den Bereich an, der hinterher sortiert sein soll (nämlich die ersten zehn Elemente).
    Der letzte Parameter ist eine Funktion, die zurückgibt, ob das erste übergebene Objekt kleiner als das zweite ist. Diese Funktion wird dann vom Sortieralgorithmus mehrfach aufgerufen.

    Edit: ui, langsam.



  • okay danke jetzt macht das alles schon einwenig mehr sinn =).

    allerdings hat das mit dem defenieren der member function nicht außerhalb funtioniert, also habe ich sie einfach ins struct miteinbezogen. dürfte doch keinen unterschied machen oder ?

    struct data
    {
         double X;
         double Y;
         double Z;
         double dist_p2(const data& rhs)
            {
            double xd = abs(X-rhs.X);
            double yd = abs(Y-rhs.Y);
            double zd = abs(Z-rhs.Z);
            return xd*xd+yd*yd+zd*zd;
    }
    
    };
    

    und bei

    data startPoint{startX,startY,startZ};
            vector<data> copy(svec);
            partial_sort(copy.begin(),copy.begin()+10,copy.end(),
                         [&](const data& p1,const data& p2)
                         {
                           return p1.dist_p2(startPoint)<p2.dist_p2(startPoint);
                         });
    

    meckert mein compiler:

    no primary expression before [
    no primary expression before ]
    no primary expression before const
    no primary expression before const

    irgentwas habe ich mal wieder extrem falsch gemacht oder 😞 ?



  • allerdings hat das mit dem defenieren der member function nicht außerhalb funtioniert, also habe ich sie einfach ins struct miteinbezogen. dürfte doch keinen unterschied machen oder ?

    Ja, das gehört in die Klassendeklaration (denn das erlaubt Inlining auch ohne LTO).

    meckert mein compiler:
    [...]

    Er wird sich an der Lambdafunktion stören, denn die gibt es erst ab C++11. Wenn du GCC >=4.5 benutzt, kannst du mit -std=c++0x kompilieren.
    Ansonsten müsstest du einen eigenen Funktor basteln, wie CStoll schon gesagt hat.



  • Athar schrieb:

    allerdings hat das mit dem defenieren der member function nicht außerhalb funtioniert, also habe ich sie einfach ins struct miteinbezogen. dürfte doch keinen unterschied machen oder ?

    Ja, das gehört in die Klassendeklaration (denn das erlaubt Inlining auch ohne LTO).

    meckert mein compiler:
    [...]

    Er wird sich an der Lambdafunktion stören, denn die gibt es erst ab C++11. Wenn du GCC >=4.5 benutzt, kannst du mit -std=c++0x kompilieren.
    Ansonsten müsstest du einen eigenen Funktor basteln, wie CStoll schon gesagt hat.

    das ist ja das merkwürdige. ich hab extra meinen gnu compiler auf -std=c++0x umgestellt.
    ich habe es testweise mit dem vs2010 kompiler Kompiliert.

    error C2662: 'data::dist_p2': this-Zeiger kann nicht von 'const data' in 'data &' konvertiert werden

    also habe ich es einfach mal geändert

    data startPoint;
    		startPoint.X = startX;
            startPoint.Y=startY;
            startPoint.Z=startZ;
            vector<data> copy(svec);
            partial_sort(copy.begin(),copy.begin()+10,copy.end(),
                         [&](data p1,data p2)
                         {
                           return p1.dist_p2(startPoint)<p2.dist_p2(startPoint);
                         });
    

    jetzt meckert vs2010 nicht mehr nur noch gnu, ich werd mal weiter schreiben.



  • Das war mein Fehler. Statt die Parameter zu ändern, solltest du das fehlende const bei dist_p2 ergänzen:

    double dist_p2(const data& rhs) const
    { ...
    


  • ah super danke 🙂



  • ich benutze code blocks mit dem mitgelieferten gnuc++ compiler. auch nach einbinden des std c++0x kann ich den code nicht kompilieren.
    hat jemand vielleicht eine idee woran es liegen könnte?

    ich lade mir mal
    http://webscripts.softpedia.com/script/Development-Scripts-js/Compilers/GNU-Compiler-Collection-26869.html
    gnu 4.6.1 herunter.
    edit : ah ich glaube der mitgelieferte gnu kompiler ist nur version 4.4.1 vielleicht liegt es daran



  • Hier wird dir geholfen:
    http://tdm-gcc.tdragon.net/

    Vernünftige MinGW-Distributionen mit GCC 4.6 sind mir bisher nicht bekannt (vernünftig=keine Abhängigkeiten zu mingwm10.dll, msvcp*.dll oder msvcrXX.dll)
    Edit: ftp://ftp.equation.com/gcc/ erfüllt das Kriterium doch. Die Namen einiger dieser DLLs tauchen zwar in der Binary auf (warum auch immer), aber importiert wird daraus nichts.
    Außerdem funktioniert mit dieser Version OpenMP anstandslos, anders als bei der neuesten TDM-Variante.



  • super funktioniert alles wie es soll.

    nochmals vielen dank =).

    allerdings hätte ich nur noch eine verständisfrage zu

    [&](const data& p1,const data& p2)
    
    [&]
    

    und zwar verstehe ich nicht wofür das sein soll, was macht es?



  • kantaki schrieb:

    super funktioniert alles wie es soll.

    nochmals vielen dank =).

    allerdings hätte ich nur noch eine verständisfrage zu

    [&](const data& p1,const data& p2)
    
    [&]
    

    und zwar verstehe ich nicht wofür das sein soll, was macht es?

    Das ist Teil eines Lambda-Ausdrucks. Ich behaupte aber mal, dass du nicht nur den Teil nicht ganz verstanden hast. Wenn du den nicht verstehst, macht der ganze Aufruf von partial_sort keinen wirklichen Sinn...


Anmelden zum Antworten