sortieren von 3 vector<double>



  • Ich möchte 3 Vektoren nacheinander sortieren. Nach einem Vektor ist ja einfach, aber ich weiß nicht, wie das mit drei Vektoren funktionieren soll.

    Ich möchte eigentlich folgendes.
    Ich habe einen Datensatz mit Temperatur, Spannung und Strom, jeweils in einem Vektor alle gleich lang. Das sind Messwerte. Jetzt habe ich einen Arbeitspunkt mit Temperatur, Spannung und Strom.
    Was ich suche sind die 4 Punkte in dem Datensatz, bei denen die Differenz am geringsten ist

    Ob probier jetzt schon eine ganze Zeit mit sort herum ... kommt aber nur Blödsinn bei raus.

    Hilfe



  • Du willst alle 3 Vektoren nach einem Kriterium sortieren?

    Du solltest lieber nur einen Vektor benutzen, dessen Elemente eine Struktur darstellen.

    struct Data
    {
      double Temperatur, Spannung, Strom;
    };
    
    vector<Data> vDatas;
    
    std::sort(vDatas.begin(), vDatas.end(), sortfunc); // sortfunc mußt du noch definieren
    

    Wie sieht denn deine Sortierfunktion bisher aus?



  • wie die daten vorliegen ist im grunde nebensächlich, das kann höchstens den verwaltungsaufwand in die höhe treiben. wichtig ist die definition einer ordnung der elemente, damit es möglich ist, die vergleiche durchzuführen. ich würd mir dazu eine abbildung auf ein skalar ausdenken. naheliegend bei punktwolken dieser art: http://de.wikipedia.org/wiki/Euklidischer_Abstand



  • Um die Sort Funktion gehts mir ja.
    Ich weiß nicht was da wie rein kommt. Bei meinem gesuche waren immer irgendwelche Parameter dabei(z.B. void). Damit kann ich nichts anfangen. Wofür stehen die. Was wird da übergeben



  • Erstmal solltest du die drei Vektoren wirklich zu einem zusammenfassen, wie es Th vorgeschlagen hat - dann brauchst du dich nicht mehr darum zu sorgen, ob und wie die einzelnen Wert zusammen bleiben.

    Als nächstes mußt du dir ein Sortierkriterium überlegen, das zu deinen Daten und Anforderungen passt - ich würde die Datensätze anhand ihres Abstandes zum Ziel vergleichen:

    struct sort_data
    {
      Data selector;
      sort_data(const Data& val) : selector(val) {}
    
      bool operator()(const Data& l,const Data& r)
      {
        return distance(l,selector)<distance(r,selector);
      }
    };
    
    ...
    Data target=...;
    sort(vDatas.begin(),vDatas.end(),sort_data(target));
    


  • ein ersatz für "<". sort verwendet den < operator, um die zu sortierenden objekte zu vergleichen. wenn du da objekte reinballerst, für die kein < op definiert ist, wird irgendwas verglichen. vielleicht die adresse oder so.

    struct Datensatz
    {
      double T, U, I; // urlaubsdaten ^^
      double dist(Datensatz &other) const { 
        return sqrt(T*other.T + U*other.U + I*other.I);
      }
    };
    
    class Cmp
    {
    	Datensatz arbeitspunkt; // mit dem wollen wir vergleichen
    
    	public:
    		Cmp(Datensatz ab) : arbeitspunkt(ab) {}
    		bool operator() (const Datensatz &a, const Datensatz &b) // true, wenn a < b
    		{
    			return a.dist(arbeitspunkt) < b.dist(arbeitspunkt); // das ist die "magic"
    		}
    };
    
    int main() {
    	Datensatz arbeitspunkt; // irgendwie füllen
    	Cmp cmp(arbeitspunkt);
    	std::vector<Datensatz> v; // füllen
    	std::sort(v.begin(), v.end(), cmp);
    	// v[0] - v[3] sind nun die datensätze mit geringstem abstand zum arbeitspunkt
    }
    

    ups, zu lang gebraucht ^^ erschreckend, wie ähnlich die snippets sich sehen Oo


Anmelden zum Antworten