Vector insert Methode wie korrekt implementieren
-
Ich versuche zurzeit mich ein wenig mit der Stl vertraut zu machen und teste gerade Vektoren.
Ich wollte nun ein Element in meinen Vector Feld einfügen
feld[2] = 8; funktioniert leider nicht, das wäre schön einfach gewesen.
Nun hab ich auf cplusplus herausgefunden man benötigt den Befehl insert.
feld.insert(2, 8); funktioniert leider auch nicht. glaub man benötigt noch
einen Iterator.Wozu braucht man diesen?
Wie setze ich diesen das ich einfach ein Element egal wo im Vector einsetzen kann?
lg#include <iostream> using namespace std; #include <vector> int main() { vector<int> feld(5, -1); vector<int>::iterator it; it = feld.begin(); // test von vektor stl feld.push_back(5); //feld[2] = 8; feld.insert(it,1, 5); for (int i = 0; i<(int)feld.size(); i++) { cout << feld[i] << ' '; }
-
Ich glaube der Vector muss an der Einfügestelle ein Element habe. Schau mal vector::resize(…) ggf. auch vector::assign(…).
Gruß
-
Nö, man kann zB auch in einen leeren Vektor einfügen. Das Element wird vor dem Element eingefügt, auf das der Iterator zeigt.
std::vector<int> feld( 5, -1 ); feld.insert( feld.begin() + 2, 8 );
-
as1as schrieb:
funktioniert leider nicht
Das ist keine Fehlerbeschreibung!
Die auskommentierte Stelle in deinem Code ist völlig in Ordnung.
-
Ups mein Fehler. Habe in meinem Programm mit mehreren Vektoren gearbeitet und habe mir einen anderen Vektor ausgeben lassen.
Schön das es doch so einfach geht;)
lg
-
as1as schrieb:
for (int i = 0; i<(int)feld.size(); i++) { cout << feld[i] << ' '; }
Zusätzlich zu der Lösung zu deinem eigentlichen Problem, die du ja schon bekommen hast, noch der Hinweis, dass diese For-Schleife sehr hässlich ist und dann auch noch einen noch hässlicheren C-Style Typecast enthält.
Das geht einfacher:
for (int wert : feld) { cout << wert << ' '; }
(statt "int wert" kannst du auch vielleicht besser das ganz allgemeine "const auto &wert" verwenden, das auch korrekt bleibt, wenn dein vector irgendwann mal was anderes als int enthalten soll)
Alternativ kannst du die die Loop auch gleich ganz sparen und std::copy mit std::ostream_iterator verwenden. Für ein Codebeispiel siehe: http://www.cplusplus.com/reference/iterator/ostream_iterator/
-
Danke für die Anmerkung. Sieht aufjedenfall besser aus.
Wie lösche ich den einen Vektor?
Ich habe eine Funktion welche einen Vektor als Parameter hat, in der Funktion
dann einen neuen Vektor erstellt diesen füllt und dann damit der andere Vektor gefüllt wird. Jedoch benötoge ich am Ende nur den Vektor der als Funktionsparameter gegeben war. Sprich bei jedem Funktionsaufruf habe ich eine Vektor im heap oder sonstwo welcher wahrscheinlich ein Speicherleck ausloest.Ich erstelle ihn durch
vector<int> zwischenspeicher( int randomzahl);
Nun wie lösche cih diesen? Oder wird er automatisch wenn die Funktion beendet wird gelöscht?
Per delete ging es nicht, uns per Destruktur wüsste ich nicht wie ich diesen in der Funktion selbst schreiben sollte.
lg
-
Ein vector<int> wird genauso gelöscht wie ein int: gar nicht.
-
manni66 schrieb:
Ein vector<int> wird genauso gelöscht wie ein int: gar nicht.
er wird schon gelöscht, das Zaubertwort hießt dabei allerdings "automatisch".
Ein nicht dynamisch (= mit new) erzeugtes Objekt verliert beim Verlassen des Scopes, in dem das Objekt definiert wurde, seine Gültigkeit.
-
Okay, also muss man sich da nicht selbst drum kümmern. Das ist gut
lg
-
manni66 schrieb:
as1as schrieb:
funktioniert leider nicht
Das ist keine Fehlerbeschreibung!
Die auskommentierte Stelle in deinem Code ist völlig in Ordnung.
it könnte wegen des push_back ungültig geworden sein.
-
camper schrieb:
manni66 schrieb:
as1as schrieb:
funktioniert leider nicht
Das ist keine Fehlerbeschreibung!
Die auskommentierte Stelle in deinem Code ist völlig in Ordnung.
it könnte wegen des push_back ungültig geworden sein.
feld[2] = 8;
enthält keinen Iterator.
-
Aber
feld[2] = 8;
fügt auch nichts ein, sondern ändert einen Wert. Zum Einfügen mitten in den Vektor muss schon insert (oder emplace) genutzt werden.Und in dem Ursprungscode gab es ein insert, das einen iterator benutzt hat, der vor einem push_back geholt wurde:
it = feld.begin(); // test von vektor stl feld.push_back(5); //feld[2] = 8; feld.insert(it,1, 5);
Auf diese Stelle, die nicht auskommentiert ist, bezog sich Camper.
-
wob schrieb:
Auf diese Stelle, die nicht auskommentiert ist, bezog sich Camper.
Nein, camper bezog sich auf meinen Post.
Was mit "einfügen" gemeint war, ist nicht klar und wird durch "funktioniert nicht" auch nicht näher erläutert.