std:: istream_iterator
|
Definiert im Header
<iterator>
|
||
|
template
<
class
T,
class
CharT
=
char
,
|
(bis C++17) | |
|
template
<
class
T,
class
CharT
=
char
,
|
(seit C++17) | |
std::istream_iterator
ist ein Einzel-Durchlauf-Eingabeiterator, der aufeinanderfolgende Objekte des Typs
T
aus dem
std::basic_istream
-Objekt liest, für das er konstruiert wurde, durch Aufruf des entsprechenden
operator
>>
. Die eigentliche Leseoperation wird durchgeführt, wenn der Iterator inkrementiert wird, nicht wenn er dereferenziert wird. Das erste Objekt wird gelesen, wenn der Iterator konstruiert wird. Das Dereferenzieren gibt nur eine Kopie des zuletzt gelesenen Objekts zurück.
Der standardmäßig konstruierte
std::istream_iterator
wird als
End-of-Stream-Iterator
bezeichnet. Wenn ein gültiger
std::istream_iterator
das Ende des zugrunde liegenden Streams erreicht, wird er gleich dem End-of-Stream-Iterator. Das Dereferenzieren oder weitere Inkrementieren ruft undefiniertes Verhalten hervor. Ein End-of-Stream-Iterator verbleibt im End-of-Stream-Zustand, selbst wenn sich der Zustand des zugrunde liegenden Streams ändert. Ohne Neuzuweisung kann er nicht mehr zu einem Nicht-End-of-Stream-Iterator werden.
Eine typische Implementierung von
std::istream_iterator
enthält zwei Datenmember: einen Zeiger auf das zugehörige
std::basic_istream
-Objekt und den zuletzt gelesenen Wert vom Typ
T
.
T
muss die Anforderungen
DefaultConstructible
,
CopyConstructible
und
CopyAssignable
erfüllen.
Inhaltsverzeichnis |
Mitgliedertypen
| Mitgliedertyp | Definition |
iterator_category
|
std:: input_iterator_tag |
value_type
|
T |
difference_type
|
Distance |
pointer
|
const T * |
reference
|
const T & |
char_type
|
CharT
|
traits_type
|
Traits
|
istream_type
|
std:: basic_istream < CharT, Traits > |
|
Die Member-Typen
|
(bis C++17) |
Memberfunktionen
Konstruiert einen neuen
istream_iterator
(öffentliche Elementfunktion) |
|
Zerstört einen
istream_iterator
, einschließlich des zwischengespeicherten Werts
(öffentliche Elementfunktion) |
|
|
gibt das aktuelle Element zurück
(öffentliche Elementfunktion) |
|
|
erhöht den Iterator
(öffentliche Elementfunktion) |
Nicht-Member-Funktionen
|
(entfernt in C++20)
|
vergleicht zwei
istream_iterator
s
(Funktions-Template) |
Hinweise
Beim Lesen von Zeichen überspringt
std::istream_iterator
standardmäßig Leerzeichen (sofern nicht mit
std::noskipws
oder Äquivalent deaktiviert), während
std::istreambuf_iterator
dies nicht tut. Zudem ist
std::istreambuf_iterator
effizienter, da es den Overhead vermeidet, das Sentry-Objekt einmal pro Zeichen zu konstruieren und zu destruieren.
Beispiel
#include <algorithm> #include <iostream> #include <iterator> #include <numeric> #include <sstream> int main() { std::istringstream str("0.1 0.2 0.3 0.4"); std::partial_sum(std::istream_iterator<double>(str), std::istream_iterator<double>(), std::ostream_iterator<double>(std::cout, " ")); std::istringstream str2("1 3 5 7 8 9 10"); auto it = std::find_if(std::istream_iterator<int>(str2), std::istream_iterator<int>(), [](int i){ return i % 2 == 0; }); if (it != std::istream_iterator<int>()) std::cout << "\nThe first even number is " << *it << ".\n"; //" 9 10" left in the stream }
Ausgabe:
0.1 0.3 0.6 1 The first even number is 8.
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| P0738R2 | C++98 | das erste Lesen könnte auf die erste Dereferenzierung verschoben werden | immer im Konstruktor durchgeführt |
Siehe auch
|
Ausgabe-Iterator, der in
std::basic_ostream
schreibt
(Klassentemplate) |
|
|
Eingabe-Iterator, der von
std::basic_streambuf
liest
(Klassentemplate) |