Wie man ein bestimmtes Element eines C ++ - AWL-Vektors ändert
vector<int> l;
for(int i=1;i<=10;i++){
l.push_back(i);
}
Nun, zum Beispiel, wie ändere ich die 5th element
des Vektors zu -1
?
Versuchte ich l.assign(4, -1);
Es ist nicht verhält wie erwartet. Keiner der anderen Vektor-Methoden zu passen scheinen.
Ich habe verwendet, Vektor, wie ich brauche random-access-Funktionalität in meinen code (mit l.at(i)
).
InformationsquelleAutor der Frage Moeb | 2010-04-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
at
undoperator[]
beide Rückgabewert eine Referenz auf das indizierte element, so können Sie einfach:oder
InformationsquelleAutor der Antwort James McNellis
Obwohl @JamesMcNellis Antwort ist eine gültige möchte ich erklären, etwas über die Fehlerbehandlung, und auch die Tatsache, dass es einen anderen Weg, das zu tun, was Sie wollen.
Haben Sie vier Möglichkeiten, den Zugriff auf ein bestimmtes Element in einem Vektor:
[]
Betreiberat(...)
std::for_each
von deralgorithm
- header der C++ - Standardbibliothek. Dies ist eine weitere Möglichkeit, die ich empfehlen kann (es verwendet intern einen iterator). Sie können mehr darüber Lesen Sie zum Beispiel hier.In den folgenden Beispielen verwende ich die folgenden Vektor als eine Laborratte und erklären den ersten drei Methoden:
Dieser erstellt einen Vektor, wie unten gesehen:
Betrachten wir zuerst die
[]
Weg, Dinge zu tun. Es funktioniert in so ziemlich der gleichen Weise, wie Sie erwarten, dass beim arbeiten mit einem normalen array. Sie geben einen index und möglicherweise Sie Zugriff auf das gewünschte Element. Ich sage möglicherweiseweil die[]
Betreiber überprüft nicht, ob der Vektor tatsächlich hat Sie viele Elemente. Dies führt zu einem stillen invalid memory access. Beispiel:Dies kann oder kann nicht dazu führen, dass eine sofortige Absturz. Worst case ist natürlich, wenn es nicht, und Sie tatsächlich bekommen, was scheint zu sein, einen gültigen Wert. Ähnlich wie arrays dies führt zu Verschwendung von Zeit zu versuchen, den Grund zu finden, warum beispielsweise 1000 Zeilen code später erhalten Sie einen Wert von
100
statt234
was irgendwie eine Verbindung zu diesem Ort, wo Sie rufen Sie ein Element aus Sie Vektor.Eine viel bessere Möglichkeit ist die Verwendung
at(...)
. Diese wird automatisch überprüfen, fürout of bounds
Verhalten und brechen Sie werfen einstd::out_of_range
. Also in dem Fall, wenn wirErhalten wir:
Die Dritte Möglichkeit ist ähnlich wie die
[]
Betreiber in dem Sinne kann man Schraube Dinge. Ein Vektor genau wie ein array ist eine Sequenz von kontinuierlichen Speicher-Blöcke mit Daten des gleichen Typs. Dies bedeutet, dass Sie können verwenden Sie Ihre Start-Adresse durch die Zuweisung an einen iterator und dann fügen Sie nur einen offset zu diesem iterator. Der offset steht schlicht und einfach, wie viele Artikel nach dem ersten Artikel, den Sie möchten, um die traverse:Wie Sie sehen können, können wir auch
wieder ein invalid memory access. Dies ist im Grunde das gleiche wie mit
at(0 + offset)
aber ohne die out-of-bounds-Fehler überprüfen.Ich würde Beratung über
at(...)
Wann immer möglich, nicht nur weil es besser lesbar im Vergleich zum iterator-Zugriff, aber durch den Fehler-überprüfung für index ungültig ist, die ich oben erwähnt habe, sowohl für den iterator mit offset-Kombination und die[]
Betreiber.InformationsquelleAutor der Antwort rbaleksandar
Dies sollte es tun:
InformationsquelleAutor der Antwort Fred Larson
Können Sie die subskript-operator
InformationsquelleAutor der Antwort Tom
Ich lieber
während Sie die [4] ist der index
InformationsquelleAutor der Antwort codexaxor