Inkrementer auf eine Funktion?
-
Hi Leute,
ich arbeite das Buch "Die C++ Programmiersprache" von dem Erfinder von C++ durch und verstehe folgendes Code-Beispiel nicht.
Hoffe das jemand mir das erklären kann.
struct Paar { string name; double wert; } vector<Paar> paare; // Verwaltet eine Menge von Paar: // suchenach s, liefere den Wert, falls gefunden; // anderfalls erzeuge ein neues Paar, und liefere den Standardwert 0 double& werte(const string &s) { for (int i = 0; i < paare.size(); i++) if (s == paare[i].name) return paare[i].wert; Paar p = { s, 0 }; paare.push_back(p); //Hänge Paar am Ende an return paare[paare.size() -1].wert; } int main() // Zählt, wie oft jede Wort in der Eingabe vorkommt { string buf; while (cin >> buf) werte(buf)++; for (vector<Paar>::const_iterator p = paare.begin(); p != paare.end(); ++p) cout << p->name << ": " << p->wert << '\n'; }Bei folgender Eingabe: aa bb bb aa aa bb aa aa
gibt es folgende Ausgabe:
aa: 5
bb: 3Die Funktion werte() verstehe ich komplett, die while-Schleife in der main-Funktion verstehe ich nicht.
- Ich sehe kein Ende der Schleife. Wann bzw. wodurch wird die Schleife beended?
- Die Funktion werte() wird in der Schleife aufgerufen, es wird beim Aufruf etwas um eins erhöht. Welcher Wert ist das, wieso und kann ich steuern welcher Wert erhöht werden soll?
- Irgendwo wird ja gezählt wie oft der Wert eingegeben wurde, aber ich sehe keine direkte erhöhung von "wert". Die Zuweisung an "wert" kann ich auch nicht erkennen.Hoffe und Bitte darum das mir das jemand erklären kann und will.
Gruß
Rudi G
-
Ganz einfach:
return paare[paare.size() -1].wert;Ist der Rückgabewert deiner Funktion, und dieser wird einfach hier:
werte(buf)++;erhöht um eins.
Und naklar ist die while Schleife irgendwann zuende, die Abbruchbedingung steht doch in der while:while (cin >> buf)Heißt soviel wie "Solange eine gültige String-Eingabe kommt, mache weiter"
-
Rudi G schrieb:
- Ich sehe kein Ende der Schleife. Wann bzw. wodurch wird die Schleife beended?
Die Schleife liest immer ein Wort in die Variable
bufein. Leerzeichen werden automatisch ignoriert. Es werden so lange Wörter eingelesen, bis ein Fehler auftritt. Dies kann zum Beispiel der Fall sein, wenn das Ende des Streams erreicht wird, also alle Zeichen eingelesen wurden, welche im Stream waren.
Ein Stream, wasstd::cinist, kann man direkt auf Gültigkeit abrufen. Also das Objekt lässt sich implizit zu einem boolschen Wert konvertieren, bzw. meistens wird dazu ein void-Zeiger genommen, welcher 0 oder ungleich 0 ist.
http://www.cplusplus.com/reference/iostream/ios/operator_voidpt.htmlRudi G schrieb:
- Die Funktion werte() wird in der Schleife aufgerufen, es wird beim Aufruf etwas um eins erhöht. Welcher Wert ist das, wieso und kann ich steuern welcher Wert erhöht werden soll?
- Irgendwo wird ja gezählt wie oft der Wert eingegeben wurde, aber ich sehe keine direkte erhöhung von "wert". Die Zuweisung an "wert" kann ich auch nicht erkennen.Die Funktion
wertegibt eine Referenz zur Variablewertzurück, welche dann inkrementiert wird. Ganz einfach ...Grüssli
-
1. http://www.cplusplus.com/reference/iostream/istream/operator>>.html
Siehe Abschnitt 'Return Value': "The object itself (*this)."
while wertet den bool-operator des zurückgegebenen Objekts aus.
Wenn die Eingabe erfolgreich war wird true zurückgegeben, wenn nicht false.2. & 3. Wie du an double**&** werte(const string &s) erkennen kannst wird eine Referenz zurückgegeben.
Refernzen funktionieren ein bisschen wie Zeiger.
Sie 'zeigen' auf eine Variable. Wenn du also einen operator (z.B. ++) auf eine Referenz ausführst wird dieser in Wirklichkeit auf die Variable ausgeführt auf die diese Referenz 'zeigt'.Vielleicht wird es so klarer:
werte(buf)++;
entspricht:
paare[i].wert++;
bzw.
paare[paare.size() -1].wert++;
-
Hey Leute,
vielen vielen Dank ihr seit echt Klasse.
string antwort() { return "Dankeschön"; }Mir hätte jede der Antworten schon gereicht um das zu verstehen aber öfters hält (hoffentlich) besser

Wünsche alle einen guten Rutsch ins (hoffentlich) erfolgreiches Jahr 2009
Gruß
Rudi G