Vectoren c++ verständnissfrage



  • so wie hier an meinem beispiel unten angeführt wird ein Iterator auf die position 2 bzw 1 des Vectors gelegt. und mit insert an position 2 bzw 1 der wert 99 angelegt, würde ich die zeile mit Vec1.insert nach dem pop.back einfügen sollte dem vectors nichts eingefügt werden da der Iterator auf das gelöschte Element zeigt und der Vector ja nicht mehr 11 Elemente(die nach dem push_back erweitert wurden) enthält sonder nur noch 10 Gross ist? bin ich damit richtig?

    2te Frage ::: Also muss man so oder so jedes mal wenn man mit einem Vector arbeitet den Iterator quasi neu positionieren?

    Danke
    Lg
    Buntehaare

    vector<int>Vec1(10); // erstellt einen vector mit einer elementanzahl von 10;
    	vector<int>::iterator it; // erstellt einen Iterator (zeiger/cursor) 
    	it=Vec1.begin()+1;  // setzt den Iterator auf die erste Pos des Vectors Vec1, definert den Iterator auch zu diesen Vector!
    	Vec1.insert(it,99); // nachdem mit dem Vector irgendetwas gemacht wrude ist die position vom Iterator werlcher zuvor mit begin() definiert wurde nicht mehr gültig!
    	cout << "Anzahl maximaler Elmente:" << Vec1.size() << endl; // gibt die grösse , die anzhal der elmente aus;
    	Vec1.push_back(45); // fügt am ende des vectors einen wert ein, und vergrössert diesen
    	Vec1.pop_back(); // löscht den letzten eintrag eines vectors, und verkleinert diesen
    


  • Bei allem was die Größe des vectors ändert muss man davon ausgehen, dass die Iteratoren ungültig werden. Ein vector::iterator ist ein einfacher Zeiger in den Speicherbereich des Vectors. Da der vector nicht bei jedem insert seinen Speicherbereich vergößert, können die Iteratoren auch mal gültig bleiben. Es ist aber reine Glückssache.



  • brotbernd schrieb:

    Bei allem was die Größe des vectors ändert muss man davon ausgehen, dass die Iteratoren ungültig werden. Ein vector::iterator ist ein einfacher Zeiger in den Speicherbereich des Vectors. Da der vector nicht bei jedem insert seinen Speicherbereich vergößert, können die Iteratoren auch mal gültig bleiben. Es ist aber reine Glückssache.

    danke ja so habe ich das auch dann richtig verstanden, kann mir vielleicht bitte jemand eine gute referenz welche den vector und seine funktionen gut erklärt, nenen, wäre sehr dankbar, in meinem c++ buch wird auf den vector leider fast garnicht eingegangen. vielleicht könntet ihr mir gleich ein gutes c++ grundwissen bis fortgeschritten Buch empfehlen, also keine pure referenz.



  • Zu diesem Thema ist Effective STL von Scott Meyers toll. Wenn du Meyers Effective C++ noch nicht hast, kannst Du Dir gleich beide besorgen. Letzteres ist absolute Pflichtlektüre.



  • vielen dank, für den buchvorschlag, werd ich mir wahrscheinlich besorgen, noch eine frage
    also wenn ich wie folgt:

    vector<int>v1(10);
    vector<int>::iterator it;
    it=v1.begin();
    
    v1.insert(it,99);
    

    ein elment eben auf der ersten position einfüge vergrössert sich der Vector mit der anzahl der elmente um eins da mit dem instert ein elment hineingeschoben wird, gibt es auch eine möglichkeit den wert an position des it zu ersetzen, also dass der wert den an pos it gestanden hat mit dem neuen ersezt wird und nicht dazwischengeschoben wird?



  • vector<int>v1(10);
    vector<int>::iterator it;
    it=v1.begin();
    
    *it = 99
    


  • aha ein iterator funktioniert also wirklich wie ein zeiger, danke!

    kann man sich dann auch die Speicheraddresse der einzelnen Elmenete ausgeben lassen? denn mit &it wird wohl nur die Addresse des Iterators selbst ausgegeben und nicht die des V1(vector<int>V1) elements?

    aha also nur über &V1[0] nicht über den Iterator selbst?



  • @buntehaare: Ich hoffe, deine fürchterliche Grammatik und Rechtschreibung spiegelt sich in deinem Code nicht wider. Zum Glück gibt's da noch den Compiler...



  • buntehaare schrieb:

    aha ein iterator funktioniert also wirklich wie ein zeiger, danke!

    kann man sich dann auch die Speicheraddresse der einzelnen Elmenete ausgeben lassen? denn mit &it wird wohl nur die Addresse des Iterators selbst ausgegeben und nicht die des V1(vector<int>V1) elements?

    aha also nur über &V1[0] nicht über den Iterator selbst?

    &(*iter)
    

    Und ja, ein Iterator ist im Prinzip nur ein mehr oder weniger intelligenter Zeiger. Bei std::vector wird das Verhalten bis auf Debug-Checks genau gleich sein, bei einer std::list muss der Iterator aber logischerweise mehr können.

    Deswegen kannst du alle STL-Algorithmen auch mit Zeigern nutzen, probiers aus.


Anmelden zum Antworten