drei Vektoren sortieren



  • Ich habe drei Vektoren (X,Y,Z) gleicher Länge, die nach Vektor X sortiert werden sollen, also aus

    X   Y   Z
    3   11  15
    2   12  16
    4   13  17
    1   14  18
    

    soll

    X   Y   Z
    1   14  18
    2   12  16
    3   11  15
    4   13  17
    

    Was mir auf die Schnelle einfällt ist eine "Drei_Feferenzen"-Klasse, von der ich einen Vektor aufbaue, und diesen dann sortiere. Gibt es da was einfacheres?



  • peterchen schrieb:

    Ich habe drei Vektoren (X,Y,Z) gleicher Länge, die nach Vektor X sortiert werden sollen, also aus

    X   Y   Z
    3   11  15
    2   12  16
    4   13  17
    1   14  18
    

    soll

    X   Y   Z
    1   14  18
    2   12  16
    3   11  15
    4   13  17
    

    Was mir auf die Schnelle einfällt ist eine "Drei_Feferenzen"-Klasse, von der ich einen Vektor aufbaue, und diesen dann sortiere. Gibt es da was einfacheres?

    Für klasse Vektor operator< implementieren, der auf .x vergleicht.
    Oder sort(..,.., Pred(x,y)) verwenden.



  • Mir fallen zwei Wege ein:

    1. Scheinbar gehören die Werte aus jeder Zeile der Vektoren immer zusammen. Dann könnte man die in eine Klasse packen und die Klasse dann in nur einen std::vector. Dafür liesse sich dann leicht ein Vergleichsoperator schreiben.

    2. Du schreibst einen Iterator iter, der auf allen drei Vektoren gleichzeitig operiert, so dass bei einem swap(*iter1, *iter2) die Werte in den Vektoren tauscht. Das stelle ich mir aber ungleich schwieriger vor.



  • Zunächst einfach eine Indexliste sortieren und anhand von der dann die Vektoren neu aufbauen.

    Bye, TGGC (Denken, und gut ist.)



  • @Ponto:
    (1) ist mist, Ich bekomme die Vektoren einzeln rein, und die müssen auch wieder einzeln raus, und aller paar Sekunden kommen Werte dazu...
    (2) geht auch ohne iteratoren, scheint im Prnzip zu funktionieren, Ich glaub' die Daten nur (noch) nicht so ganz...
    (war nicht so schlimm...

    CVecRef(float & x, float & y, float & z)
    operator < () { return x < rhs.x; }
    operator = () ( x = rhs.x; y=rhs.y; z=rhs.z; }
    

    Ist natürlich trotzdem häßlich, ich muß einen Vektor mit Nx3 referenzen zusamemnbauen und den sortieren.

    @TGCC:
    kannst Du mir noch nen Tip geben, wie? Ich stell' mich mit der STL immer so doof an... 🙂



  • peterchen schrieb:

    Was mir auf die Schnelle einfällt ist eine "Drei_Feferenzen"-Klasse, von der ich einen Vektor aufbaue, und diesen dann sortiere. Gibt es da was einfacheres?

    #include <vector>
    #include <algorithm>
    #include <cassert>
    #include <iostream>
    
    template<typename T>
    struct Ref
    {
    	T &ref;
    
    	Ref(T &ref) 
    		:	ref(ref)
    	{
    	}
    
    	Ref &operator=(const Ref &rh)	
    	{		
    		ref = rh.ref;
    		return *this;
    	}
    
    	bool operator<(const Ref &rh) const
    	{
    		return ref < rh.ref;
    	}
    };
    
    int main()
    {
    	int ar1[] = {3, 2, 4, 1};
    
    	std::vector<int> v1(ar1, ar1 + 4);
    	std::vector<Ref<int> > v2(v1.begin(), v1.end());
    
    	std::sort(v2.begin(), v2.end());
    
    	for(size_t i = 0, sz = v1.size(); i < sz; ++i)
    	{
    		std::cout << v1[i] << " ";
    	}
    }
    

    ⚠ out :

    1 3 3 4
    

    du erwartest aber:

    1 2 3 4
    

    😃 😃 😃 😉



  • grrch, hast recht.
    Selbst wenn ich die referenzen im Assignment umbiege, klappt's nicht 😕 (versuch ich nich dahinterzukommen wieso).

    schad.

    @Gast: sorry, hab deinen Post ursprünglich nicht gesehen. Ich hab drei einzelne Vektoren, keinen Vektor von struct, und wollte mir das hin-und-her-kopieren eigentlich sparen.



  • peterchen schrieb:

    (1) ist mist, Ich bekomme die Vektoren einzeln rein, und die müssen auch wieder einzeln raus, und aller paar Sekunden kommen Werte dazu...

    Hast du dir schon mal std::set bzw std::multiset angesehen? Falls du keinen wahlfreien Zugriff brauchst musst du nicht jedes mal neu sortieren...



  • die kommen so rein und müssen so raus.
    Im Moment kopier' ich erstmal um und wieder zurück. (hab noch ein paar Tests reingeworfen, um unnötige Updates zu vermeiden)


Anmelden zum Antworten