Vektor sortieren



  • Hallo, ich habe eine Frage.
    Und zwar möchte ich gern einen Vektor sortieren. Dieser Vektor besitzt Elemente in folgender Form: {x1, y1, z1, x2, y2, z3, x3, ...}.
    Ich würde nun gern diesen Vektor nach einer der 3 Raumkoordinaten sortieren z.B nach x und dabei die dazugehörigen y und z Werte "mitnehmen".
    Bsp: {1,2,3,7,8,9,4,5,6)
    Sortiert: (1,2,3,4,5,6,7,8,9)

    Mein bisheriger Stand ist die Definition einer Sortierfunktion. Dieser kann ich aber nicht sagen, dass sie nur jeden dritten Wert anschauen soll.

    #include <iostream>
    #include <algorithm>    
    #include <vector>      
    
    bool myfunction (int i,int j) { return (i<j); }
    
    using namespace::std;
    int main(){
    
    	int myints[] = {32,71,12,45,26,80,53,33,99};
    	std::vector<double> myvector(myints, myints+8);
    
    	std::sort (myvector.begin(), myvector.end(), myfunction);
    
      	for (std::vector<double>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        std::cout << ' ' << *it;
      	std::cout << '\n';
    
    }
    

    Danke für eure Hilfe.



  • Warum initialisierst du erst nen C-STyle array um es danach in nen vector zu schieben? Nimm Brace Initialization und leg direkt den Vector an, außerdem solltest du auto verwenden um den Iterator Typ abzuleiten in deiner for loop.



  • Danke für den Hinweis

    #include <iostream>
    #include <algorithm>    
    #include <vector>  
    
    bool myfunction (int i,int j) { return (i<j); }
    
    using namespace::std;
    int main(){
    
    	vector<double> myvector {32,71,12,45,26,80,53,33,99};
    
    	sort (myvector.begin(), myvector.end(), myfunction);
    
    	for(int i = 0; i < myvector.size(); i++) cout << myvector[i]<<endl;	
    
    }
    


  • Erstmal eine kurze einfache Frage: hast du immer genau 9 Werte im Vector (oder allgemein immer 3 Koordinaten in N Dimensionen? Wenn ja, fällt das Problem ja darauf zurück, 3 Werte zu sortieren, was du manuell machen könntest.



  • Wenn da immer drei Werte zusammengehören, dann mach einen Typ draus.

    Meinetwegen

    struct v3{ int v[3]; };
    

    Den packst Du dann in Deinen Vector. Dann schreibst Du Deine Sortierfunktion, dass diese zwei v3s vergleicht.

    bool z_compare(const v3& a, const v3& b);
    

    Eine Ausgabefunktion wäre wohl auch hilfreich

    std::ostream& operator<<(std::ostream& out, const v3& v);
    

    Evtl. lohnte es sich, Dein Lehrmaterial zu aktualisieren. Das scheint nämlich schon in die Jahre gekommen zu sein.



  • Bzw noch 2 weitere Fragen: sind es immer 3 Dimensionen oder auch mal mehr/weniger? Und warum zur Hölle ist das auf diese Art gespeichert?

    Für ne allgemeine Lösung fiele mir nur die Standardlösung ein, einen myvector.size()/N großen Indexvector zu erstellen und diesen zu sortieren. Dann kannst du dir danach überlegen, ob du die Reihenfolge aus dem Indexvector dann auf deinen Vector überträgst.



  • Hallo wob,
    es können verschieden viele Punkte bis in die Millionen sein, die Anzahl an Koordinaten ist aber immer 3. Der Vektor selbst ergibt sich durch das zeilenweise Einlesen einer Datei. Unter der Annahme ich hätte 30 Koordinaten wäre myvector.size()/3 dann 10 Punkte. Was genau täte ich dann mit dem Index-Vektor? Nur jeden x-Wert in diesen verschieben? Ich verstehe es leider nicht ganz.
    Danke für deine Antwort.

    Hallo Furble Wurble,
    das schaue ich mir mal genauer an. Auch dir danke für die Antwort.



  • Wenn du die Daten unter Kontrolle hast (also schon selbst einliest), dann nimm FurbleWurbles Vorschlag (oder nimm sogar ein struct Punkt3d { double x, y, z; } daraus statt dem double v[3] - je nach Geschmack).

    Was ich meinte:

    vector<double> v = {1,2,3,7,8,9,4,5,6}; // daten
    vector<size_t> idx = {0,1,2}; //index, immer von 0 bis v.size()/3-1
    sort(idx.begin(), idx.end(), 
         [](size_t a, size_t b){ 
             return v[3*a] < v[3*b]; // 3*a+1 wäre für y, +2 für z
         });
    

    Nun kannst du mit v[idx[i]+n] auf den sortierten i-ten Wert der n-ten Koordinate zugreifen (n=0,1,2; i=0,...,v.size()/3-1).


Anmelden zum Antworten