Vergleich von 2 Vektoren mit unterschiedlicher Größe -> doppelte Wert ausgeben



  • Hallo.
    Ich habe 2 Vektoren die ich mit CSV-Dateien befülle. Ich möchte die beiden Vektoren miteinander vergleichen und die Werte die in beiden CSV-Dateien vorkommen ausgeben. (Die erste CSV-Datei ist immer größer)

    int main (){
    
    struct SCsv1
    	{
    		double a;
    		double b;
    		//....
    	};
    
    	struct SCsv2
    	{
    		double a;
    		double c;
    		//....
    	};
    
    	vector<SCsv1> csvData1;
    	for(int i=0; i<20; ++i)
    	{
    		SCsv1 scsv1 = {i,i*2};
    		csvData1.push_back(scsv1);
    	}
    
    		vector<SCsv2> csvData2;
    	for(int i=15; i<20; ++i)
    	{
    		SCsv2 scsv2 = {i,i*3};
    		csvData2.push_back(scsv2);
    	}
    

    Mein gewünschte Output wäre dann: 15,16,17, usw.

    Hätte einer eine Idee wie ich dieses Problem lösen kann?

    for(int i=0; i < csvData1.size(); ++i){
    			if (csvData1[i].a == csvData2[i].a)
    			// vllt noche eine if-Schleife?
    		}
    

    Vielen Dank im Voraus.



  • Es wichtig solche einfachen Aufgaben mit der Zeit selber loesen zu koennen, weshalb ich hier keine Loesung posten moechte.

    Aus meiner Sicht ist die beste Herangehensweise einfach mal zwei Beispiel-Vektoren auf einem Blatt Papier aufzuzeichen und sich zu ueberlegen, wie man das jetzt von Hand machen wuerde. Danach versucht das ganze als Algorithmus aufzuschreiben (immer noch auf Papier!). Dann ruhig den Algorithmus mal (immer noch auf Papier) fuer ein Paar Beispiele durchprobieren und schauen, ob man irgendwo einen dummen Denkfehler gemacht hat. Wichtig: Die Beispiele muessen repraesentativ sein und sollten auch Corner-Cases beinhalten.

    Danach gibt es verschiedene Moeglichkeiten:h
    - Implementieren
    - Algorithmus (auf Papier) optimieren
    - etc.

    Wenn du das machst bin ich mir sicher, dass du eine einfache Version davon selber implementieren kannst. Poste diese wenn du soweit bist und wir koennen das ganze dann eventuell verbessern/optimieren.


  • Mod

    Alle Werte in zwei sets packen (aber nicht unordered set!). Wenn die vectoren für nichts anderes gebraucht werden, kann man sie sich auch gleich ganz sparen. Dann std::set_intersection der beiden sets.

    Alternativ, falls man eventuell später sortierte vectoren braucht, kann man auch sortierte vectoren durch set_intersection jagen.

    Oder man kann auch set und sortierte vectoren mischen, weil es set_intersection bloß darauf ankommt, dass die unterliegenden Container sortiert sind.

    Nochmals alternativ kann man auch ein oder zwei unordered_sets benutzen, aber dann darf man nicht sert_intersection benutzen, weil dies sortierte Ranges erwartet. Da muss man dann selber die Intersection ausrechnen. Durch eine der Mengen iterieren (egal ob vector, set oder unordered_set) und für jedes Element gucken, ob es im unordered_set ist, sollte schon ziemlich optimal sein.

    Oder noch viele andere Möglichkeiten...



  • @icarus danke für die Motivation. Hier meine Lösung. War eigentlich doch nicht so schwer 🙂

    for (int i = 0; i < csvData1.size(); ++i) {
                         for (int j = 0; j <csvData2.size(); ++j) {
                                    if (csvData1[i].a == csvData2[j].a) {
                                              cout << csvData1[i].a << endl;
    								}
    					 }
              }
    		   std::cin.get();
    

    @SeppJ danke für den Tipp



  • Damit hast du eine sehr ineffiziente Implementierung gefunden 👎

    Du machst nämlich n*m Vergleiche (n=csvData1.size, m=csvData2.size).

    Und was passiert erst, wenn csvDatei1 zweimal die Zeile z enthält und Datei2 auch zweimal die Zeile z enthält?

    Wenn du dich bei SeppJ bedankst, warum nutzt die die gegebenen Tipps dann nicht?


  • Mod

    wob schrieb:

    Wenn du dich bei SeppJ bedankst, warum nutzt die die gegebenen Tipps dann nicht?

    Ich benutze abschreckende Wörter wie unordered_set oder set_intersection, viele sogar mit std:: davor. Wenn man ein schlechtes Lehrbuch hat (-> Siehe die Benutzung des Begriffs 'if-Schleife'), hat man so etwas noch nie gehört. Es klingt zwar cool, aber man weiß nicht, was man konkret machen soll.


Anmelden zum Antworten