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_:)


Anmelden zum Antworten