Aus 2 vector mach 1 vector. wie?
-
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 auchund 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