std::istream_iterator
| Definiert in Header <iterator>
|
||
template< class T,
class CharT = char,
class Traits = std::char_traits<CharT>,
class Distance = std::ptrdiff_t >
class istream_iterator
: public std::iterator<std::input_iterator_tag, T, Distance, const T*, const T&>
|
(bis C++17) | |
template< class T,
class CharT = char,
class Traits = std::char_traits<CharT>,
class Distance = std::ptrdiff_t >
class istream_iterator;
|
(seit C++17) | |
std::istream_iterator ist ein Single-Pass-Eingabeiterator, der sukzessive Objekte des Typs T aus dem std::basic_istream-Objekt, für das er konstruiert wurde, durch Aufruf des entsprechenden operator>> liest. Der eigentliche Lesevorgang erfolgt beim Inkrementieren des Iterators, nicht beim Dereferenzieren. Das erste Objekt wird bei der Konstruktion des Iterators gelesen. Dereferenzieren gibt nur eine Kopie des zuletzt gelesenen Objekts zurück.
Der default-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. Weiteres Dereferenzieren oder Inkrementieren führt zu undefiniertem Verhalten. Ein End-of-Stream-Iterator bleibt im End-of-Stream-Zustand, auch wenn sich der zugrunde liegende Stream ändert. Ohne eine Neuzuweisung kann er nicht wieder zu einem Nicht-End-of-Stream-Iterator werden.
Eine typische Implementierung von std::istream_iterator enthält zwei Datenelemente: 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.
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) |