Aus 2 vector mach 1 vector. wie?



  • Hi.

    Ich habe 2 vector<> die ich getrennt sortiert habe und jetzt möchte ich gerne diese Beiden zusammenfügen, um in einer Schleife sie durchzugehen. Kann da wer bitte helfen? Ist bestimmt ganz einfach, aber ich arbeite zum ersten male mit vector<> 🙂





  • Mhh irgendwie peil ich das nicht

    iterator merge( iterator start1, iterator end1, iterator start2, iterator end2, iterator result );
    
    vector<MyStruct> ergebnis,vec1,vec2;
    // sortiere vec1 und vec2
    ...
    // füge beide vector zusammen
    ergebnis.std::merge(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),????);
    

    Was muss denn in "????" rein? 🙄





  • ergebnis.std::merge(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(), back_inserter( ergebnis));
    


  • vector<MyStruct> ergebnis,vec1,vec2;
    

    Etwas unglückliches Beispiel, da man dort gleich nen unbekannten Befehl "back_inserter" nutzt
    Ich hatte zu allererst so probiert

    std::merge(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),ergebnis.begin());
    

    aber da kam:
    [C++ Fehler] algorith.cc(1657): E2093 'operator<' ist im Typ 'MyStruct' für Argumente desselben Typs nicht implementiert.

    Das gleiche kommt aber auch bei deinem Beispiel, also muss der Fehler ja doch woanders liegen 😮

    std::merge(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),std::back_inserter(ergebnis));
    

    Das hier funktioniert Fehlerfrei:

    std::sort(vec1.begin(),vec1.end(),qSort());
    

    Ich verstehe jetzt nicht wirklich wo der Fehler liegen soll 🙄

    @niemand
    Produziert leider:
    [C++ Fehler] Unit1.cpp(1697): E2316 'merge' ist kein Element von 'vector<MyStruct,allocator<MyStruct> >'



  • vectorilo schrieb:

    [C++ Fehler] algorith.cc(1657): E2093 'operator<' ist im Typ 'MyStruct' für Argumente desselben Typs nicht implementiert.

    er will die element reihenfolge wissen somit musst du bei deiner klasse den operator < überschreiben. wie im beispiel



  • std::merge(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),std::back_inserter(ergebnis), qSort());
    

    sollte es aber dann tun.

    Sowohl sort als auch merge bekommen ein BinaryPredicate, welches für den Vergleich genutzt wird. Übergibst Du das den Funktionen nicht, wird der operator<() für den Vergleich genommen. Der muss dann natürlich auch implementiert sein.



  • Beispiel

    typedef std::vector<int> cType;
    cType cont1, cont2, work;
    std::merge(cont1.begin(),cont1.end(), cont2.begin(), cont2.end(), std::back_inserter(work));
    

    Meins

    struct MyStruct
    {
    // verschiendes
    };
    typedef std::vector<MyStruct, std::allocator<MyStruct> > Vector;
    Vector ergebnis,vec1,vec2;
    std::merge(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),std::back_inserter(ergebnis));
    

    Klappt jedoch leider nicht.

    @niemand
    Dein Beispiel geht sauber durch, aber sortiert nochmals neu? weil statt vec1 und anschliessend vec2 ist es vec2 und dann vec1, das will ich ja nicht.

    Das mit dem operator<() verstehe ich erlich gesagt noch nicht wirklich, bitte mehr helfen 🤡

    Ich möchte 2 vectoren verbinden und dabei vec1 vorne und danach vec2 haben.



  • Vector ergebnis,vec1,vec2;
    ergebnis = vec1;
    std::copy(vec2.begin(), vec2.end(), std::back_inserter(ergebnis));
    


  • Wir sind - glaube ich - alle davon ausgegangen, dass Du die beiden vector mischen willst (also einen sortierten Gesamtvektor).

    ergebnis = vec1;
    std::copy( vec2.begin(), vec2.end(), back_inserter( ergebnis));
    


  • vectorilo schrieb:

    Ich möchte 2 vectoren verbinden und dabei vec1 vorne und danach vec2 haben.

    das wirft ein ganz neues licht auf die sache. 😃

    so was zum beispiel

    std::vector<int> v1;
    	std::vector<int> v2;
    	std::vector<int> vResult;
    
    	v1.push_back(5);
    	v1.push_back(15);
    	v1.push_back(25);
    
    	v2.push_back(6);
    	v2.push_back(16);
    	v2.push_back(26);
    
    	std::copy(v1.begin(), v1.end(), std::back_inserter(vResult));
    	std::copy(v2.begin(), v2.end(), std::back_inserter(vResult));
    
    	std::copy(vResult.begin(), vResult.end(), std::ostream_iterator<int>(std::cout, " "));
    

    [edit]
    @niemand
    jep, bin ich auch

    und zu langsam war ich auch 😡



  • Juhu das klappt famos, vielen dank!



  • vectorilo schrieb:

    Das mit dem operator<() verstehe ich erlich gesagt noch nicht wirklich, bitte mehr helfen 🤡

    Der wird standardmäßig für die Sortierung verwandt. Wie hast du denn die Vektoren ursprünglich sortiert? Daraus könntest du auch ein Prädikat machen.

    vectorilo schrieb:

    Ich möchte 2 vectoren verbinden und dabei vec1 vorne und danach vec2 haben.

    Das ist eigentlich noch simpler als die vorangegangene std::copy-Variante:

    vector<foo> vec1, vec2;
    // ...
    vec1.insert(vec1.end(), vec2.begin(), vec2.end());
    
    // analog dazu mit 'Ergebnis-vector':
    vector<foo> res(vec1.begin(), vec1.end());
    res.insert(res.end(), vec2.begin(), vec2.end());
    

    Damit ist aber das Ergebnis nicht mehr zwangsläufig sortiert.

    Wenn du solche Aktionen öfter brauchst (und vor allem auf wahlfreien Zugriff verzichten kannst) lohnt sich evtl auch ein Blick auf std::list.



  • Ich habe da auch mal eine Frage. Wenn man die Elemente in einer Schleife durchgeht, besteht die Möglichkeit diese irgendwie zu ändern?

    vector<daten>::const_iterator Iter = vec.begin();
    do {
       if ((*Iter).zahl==5)
       {
          (*Iter).zahl = 1; // das geht ja nicht
       }
    } while(++Iter != vec.end());
    

    Kann da wer was zu sagen? 😕



  • muhli schrieb:

    Ich habe da auch mal eine Frage. Wenn man die Elemente in einer Schleife durchgeht, besteht die Möglichkeit diese irgendwie zu ändern?

    vector<daten>::const_iterator Iter = vec.begin();
    do {
       if ((*Iter).zahl==5)
       {
          (*Iter).zahl = 1; // das geht ja nicht
       }
    } while(++Iter != vec.end());
    

    Kann da wer was zu sagen? 😕

    Um ein vector-Element über einen Iterator zu ändern darfst du keinen const_iterator verwenden 😉

    Caipi



  • *Headshot* 😮 🙄 :p



  • vector<daten>::iterator

    Wenn du nen constanten Interator verwendest ist ja klar dass du das nicht machen kannst. Geht aber natürlich nur wenn der Vekot selber nicht const ist.

    edit: kagge zu langsam...



  • BTW: Statt "(*iter)." verwende doch lieber "iter->", dann müssen arme Sides nicht so lange überlegen was da gemacht wird 😉

    MfG SideWinder


Anmelden zum Antworten