Vektoren: Gleiche Einträge löschen?
-
Hallo,
ich habe einen Vektor, den ich gerne noch einmal in Vektoren "aufsplitten" möchte.Die einzelnen Elemente sehen bis nun so aus:
vektor[0] -> test1a|test1b vektor[1] -> test2a|test2b vektor[2] -> test3a|test3bSie sollen nachher so aussehen:
vektor[0][0] -> test1a vektor[0][1] -> test1b vektor[1][0] -> test2a vektor[1][1] -> test2b vektor[2][0] -> test3a vektor[2][1] -> test3bDas soll aber möglichst effizient sein.
Danke!!
-
wozu brauchst du das?
was spricht dagegen, es von anfang an so abzuspeichern?
welche typen haben test1a / test1b ?
sind noch andere objekte in der klasse gespeichert?bb
-
Da brauchst du einen anderen Typen. Z.B sowas:
std::vector<std::vector<int> > v; ... std::vector<int> v1; std::vector<int> v2; std::vector<int> v3; v1.push_back (11); v1.push_back (12); v1.push_back (13); v2.push_back (11); v2.push_back (22); v2.push_back (23); v3.push_back (31); v3.push_back (32); v3.push_back (33); ... v.push_back (v1); v.push_back (v2); v.push_back (v3);
-
@unskilled: Leider bekomme ich die Werte genau so vorgegeben (von einem anderen Programm) und ich muss sie dann auswerten

@drakon: So ähnlich sah mein Ansatz auch aus, nur hat das bei den vielen Datensätzen sehr, sehr viel Zeit in Anspruch genommen(, bis ich dann erst zum eigentlichen Auswerten komme). Gibt es da nicht noch etwas geschickteres?
-
Achja, der Datentyp, den ich dafür benutze, ist std::string...
-
Das klingt so, als hättest du std::vector lediglich im Debug Mode gebraucht. Im optimierten Modus bist du viel schneller.
Im übrigen könnte man auch noch evaluieren, welchen Container du am besten benutzt, denn, wenn du viele Einfüge/Lösch Operationen hast, dann ist std::vector denkbar ungeeignet. (vlt. eher eine std::list? oder std::deque?)
Sie dazu z.B hier:
http://stackoverflow.com/questions/471432/in-which-scenario-do-i-use-a-particular-stl-containerEDIT:
Achja.. std::string ist sehr aufwändig bei vielem kopieren. Vlt. geht auch was anderes?
-
ich geh mal (frecherweise^^) davon aus, dass du den alten container danach nicht mehr brauchst!?
string hat ne fkt swap (Laufzeit O(1)) - also kannst du die strings einfach swappen:struct data { std::string a; std::string b; }; std::vector<data> old = strange_function(); std::vector<std::string> new_one(old.size()); std::vector<std::string> new_two(old.size()); for(std::vector<std::string>::size_type i(0), e(old.size()); i != e; ++i) { old[i].a.swap(new_one[i]); old[i].b.swap(new_two[i]); }sehr viel schneller geht es imho nicht...
das swappen+schleife könnte man jetzt noch in ne fkt packen und dann mit transform abstrahieren - aber das ändert (vermutlich) nichts an der laufzeit max. an der wartbarkeit, die dadurch zumindest in meinen augen nicht signifikant erhöht wird...btw: Vector hört sich hier (für mich) durchaus sinnvoll an...
bb