std:: istream_iterator
| Definiert in 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 Single-Pass-Eingabeiterator, der sukzessive Objekte vom Typ T aus dem std::basic_istream-Objekt liest, für das er konstruiert wurde, indem der entsprechende operator>> aufgerufen wird. Die eigentliche Lesoperation wird beim Inkrementieren des Iterators ausgeführt, nicht beim Dereferenzieren. Das erste Objekt wird beim Konstruieren des Iterators gelesen. Das Dereferenzieren gibt nur eine Kopie des zuletzt gelesenen Objekts zurück.
Der Standardkonstruktor von 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 bleibt im End-of-Stream-Zustand, auch wenn sich der zugrunde liegende Streamzustand ändert. Ohne eine Neuzuweisung kann er nicht mehr zu einem Nicht-End-of-Stream-Iterator werden.
Eine typische Implementierung von std::istream_iterator speichert zwei Datenmember: einen Zeiger auf das zugehörige std::basic_stream-Objekt und den zuletzt gelesenen Wert vom Typ T.
T muss die Anforderungen DefaultConstructible, CopyConstructible und CopyAssignable erfüllen.
Inhalt |
[bearbeiten] Member-Typen
| Mitgliedertyp | Definition |
iterator_category
|
std::input_iterator_tag |
value_type
|
T |
difference_type
|
Distance |
Zeiger
|
const T* |
Referenz
|
const T& |
char_type
|
CharT
|
traits_type
|
Traits
|
istream_type
|
std::basic_istream<CharT, Traits> |
|
Die Membertypen |
(bis C++17) |
[edit] Memberfunktionen
konstruiert einen neuen istream_iterator(public member function) | |
destruiert einen istream_iterator, einschließlich des gecachten Werts(public member function) | |
| gibt das aktuelle Element zurück (public member function) | |
| bewegt den Iterator vorwärts (public member function) |
[edit] Nicht-Member-Funktionen
| (in C++20 entfernt) |
vergleicht zwei istream_iterators(function template) |
[edit] Hinweise
Beim Lesen von Zeichen überspringt std::istream_iterator standardmäßig Leerzeichen (es sei denn, dies wird mit std::noskipws oder Äquivalenten deaktiviert), während std::istreambuf_iterator dies nicht tut. Darüber hinaus ist std::istreambuf_iterator effizienter, da er den Overhead für die Konstruktion und Destruktion des Sentry-Objekts einmal pro Zeichen vermeidet.
[edit] 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.
[edit] Defect reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| P0738R2 | C++98 | der erste Lesevorgang könnte auf die erste Dereferenzierung verschoben werden | wird immer im Konstruktor ausgeführt |
[edit] Siehe auch
| Ausgabe-Iterator, der in std::basic_ostream schreibt (Klassenvorlage) | |
| Eingabe-Iterator, der aus std::basic_streambuf liest (Klassenvorlage) |