Aus 2 vector mach 1 vector. wie?



  • 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