Einen Vektor in einer Funktion ändern
In der Lektion über Funktionen hast du gesehen, dass eine Funktion eine Kopie eines Vektors bekommt. Ändert sie die Kopie, bleibt der Vektor des aufrufenden Codes gleich. Jetzt weißt du, wie du das änderst: Mache den Parameter zu einer Referenz auf einen Vektor, std::vector<int>&.
#include <iostream>
#include <vector>
void fuegeWurfHinzu(std::vector<int>& wuerfe, int wurf) {
wuerfe.push_back(wurf);
}
int main() {
std::vector<int> wuerfe = {4, 2};
fuegeWurfHinzu(wuerfe, 6);
fuegeWurfHinzu(wuerfe, 1);
std::cout << "Anzahl der Würfe: " << wuerfe.size() << std::endl;
return 0;
}Das gibt aus:
Anzahl der Würfe: 4Ohne das & würde die Funktion die Würfe ihrer Kopie hinzufügen, und das Programm würde Anzahl der Würfe: 2 ausgeben.
Über eine Referenz kannst du auch die Elemente eines Vektors ändern. Diese Funktion verdoppelt jede Zahl im Vektor:
void verdoppleAlle(std::vector<int>& zahlen) {
for (int i = 0; i < zahlen.size(); i++) {
zahlen[i] = zahlen[i] * 2;
}
}Achte auf die bereichsbasierte for-Schleife. Diese Version ändert den Vektor nicht, obwohl der Parameter eine Referenz ist:
void verdoppleAlle(std::vector<int>& zahlen) {
for (int zahl : zahlen) {
zahl = zahl * 2;
}
}In jedem Durchlauf der Schleife ist zahl eine Kopie eines Elements, genau wie ein Parameter, der als Wert übergeben wird. Die Schleife verdoppelt die Kopien, und der Vektor bleibt, wie er war. Das Programm lässt sich trotzdem ohne Fehler kompilieren und läuft. Willst du in einer solchen Schleife die Elemente ändern, schreibe auch hier &:
void verdoppleAlle(std::vector<int>& zahlen) {
for (int& zahl : zahlen) {
zahl = zahl * 2;
}
}Jetzt ist zahl in jedem Durchlauf eine Referenz auf ein Element des Vektors, und alles, was du mit zahl machst, passiert mit dem Element. Die Schleife mit Index aus dem ersten Beispiel funktioniert genauso gut.
So schreibst du es:
Anweisungen
- 1
Die Funktion
bonusHinzufuegensoll zum Ergebnis jedes Spielers Bonuspunkte addieren, aber das Programm gibt die ursprünglichen Ergebnisse12,7und15aus. Die Funktion hat zwei Fehler. Behebe zuerst den Parameter: Die Funktion muss eine Referenz auf den Vektor bekommen, nicht eine Kopie. Das Programm gibt trotzdem noch dieselben Zahlen aus. Warum? - 2
Behebe auch die Schleife in der Funktion, damit sie die Elemente des Vektors ändert und nicht ihre Kopien. Das Programm gibt dann die Ergebnisse mit Bonus aus, eines pro Zeile:
17,12und20.