Frage zu std::istream_iterator und std::for_each
-
Hallo.
Bei folgendem Beispiel habe ich ein Verständnissproblem.#include <iostream> #include <string> #include <map> #include <algorithm> using namespace std; map<string, int> histogram; void merken(const string &s) { histogram[s]++; } void ausgeben(pair<string, int> p) { cout << p.first << ' ' << p.second << endl; } int main() { istream_iterator<string> ii(cin); istream_iterator<string> eos; for_each(ii, eos, merken); for_each(histogram.begin(), histogram.end(), ausgeben); return 0; }
Beim ersten for_each wird der eingabeStream durchgegangen von ii bis eos. und für jeden string die Funktion merken aufgerufen.
Ich weis nur nicht auf was der Iterator eos zeigt. (Dieser müsste doch auf das Ende des Eingabe Streams zeigen.)Ich habe diesen Code vom Struppi-Buch.
Bitte helft mir. Ich weis echt nicht wie das geht.
-
eos ist ein default-konstruierter istream_iterator. Das bedeutet, dass eos != ii, solange der ii zugeordnete Stream nicht am Ende ist. Ab dann ist ii = eos. Das funktioniert, weil Stream-Iteratoren spezielle überladene Vergleichsoperatoren haben.
-
Das bedeutet, dass der oben gepostete Code korrekt ist?
Bei mir bleibt das aber im ersten for_each hängen.
-
Weil dein cin kein EOF erzeugt. Mach mal folgendes:
- schreibe eine Textdatei (bar.txt)
- compiliere das programm (foo.exe oä)
- foo < bar.txt
Oder drück irgendwann Strg+Z (Windows) bzw. in einer leeren Zeile Strg+D (Unix).
-
Ich frag mal ganz blöd:
Warum ne textdatei machen?
Ich dachte, dass ich das in der Konsole eingeben muss.
[Strg]+Z gibt bei mir nur ^z aus.
-
Nach dem ^Z musst du noch Enter drücken ...
-
Danke.
Klappt jetzt wie ich es mir vorgestellt habe.