std::vector iterator und insert?
-
Hallo,
habe einen Vector XXX mit 10 elementen! Nun will ich immer zwischen den Elementen im reisverschlussverfahren ein neues einfügen
Vorher : 1,2,3,4,5,6,7,8,9,10 (10 elemente)
Nacher : 1,a,2,b,3,c,4,d,5,e,6,f,7,g,8,h,9,i,10 (9 elemente)
Wie kann ich das via iterator umsetzen , mir verhauts immer den iterator!!
for(std::vector<...>::iterator it= XXX .begin(); it != XXX .end(); it++,i++){ XXX .insert(it++,(i+10)); }
-
insert() invalidiert die Iteratoren ab der Einfügeposition (bei einem Kapazitäts-Überlauf alle - dagegen hilft im Zweifelsfall ein reserve). Also wäre es vielleicht eine Lösung, die neuen Elemente von hinten einzufügen.
PS: Wozu soll das gut sein?
-
ja wollte elemente nachträglich einfügen, aber muss sie wohl doch anfangs abwechseln pushen... schwer zu erklärne wofür das gut ist;)
wäre aber trozdem gut, wenn es klappen würde...
EDIT: wird beim inserten, der vector nich verlängert?EDIT 2: so klappt;)
for(std::vector<...>::iterator it= XXX .begin(); it != XXX .end()-1; it++,i++){ it= XXX .insert(++it,(i+10)); }
-
Du könntest ihn doch vorher schon auf die richtige Größe bringen und dann in einem Rutsch Elemente hinzufügen und die alten verschieben:
int main(int argc, char *argv[]) { // Original-Vektor vector<char> nums; for ( char i=1; i<11; i++ ) nums.push_back( i ); // Elemente einfügen ('a' bis 'i') nums.resize( nums.size()*2 - 1 ); char to_insert = 'i'; for ( vector<char>::iterator old_one=nums.begin()+9, new_one=nums.end()-1; old_one>nums.begin(); old_one--, new_one-=2 ) { *new_one = *old_one; *(new_one-1) = to_insert--; } // Vektor ausgeben for ( size_t i=0; i<nums.size(); i++ ) cout << (int)(nums[i]) << " "; cout << endl; return 0; }oh, zu spät... na gut..
-
BorisDieKlinge schrieb:
EDIT: wird beim inserten, der vector nich verlängert?
Ja, wird er - und weil die vector-Elemente hintereinander im Speicher stehen, passiert das, indem alle Elemente nach der Einfügeposition nach hinten verschoben werden (und notfalls neuer Speicher angefordert wird).
PS: Wenn du häufiger Elemente in den Container reinquetschen willst, ist evt. eine std::list geeigneter.
-
ne war schon durchdachte, der vector wird anfangst entsprechen paramter erstellt, und dann nun noch kopiert! somit hat das keine auswirkung auf performance:) sonst würd ich schon ne liste nehmen_:)