Namespaces
Variants

std::istream_iterator

Von de.cppreference.net
 
 
Iterator-Bibliothek
Iterator-Konzepte
Iterator-Primitive
Algorithmuskonzepte und Hilfsmittel
Indirekte aufrufbare Konzepte
Allgemeine Algorithmenanforderungen
(C++20)
(C++20)
(C++20)
Hilfsmittel
(C++20)
Iterator-Adapter
Bereichszugriff
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
 
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 iterator_category , value_type , difference_type , pointer und reference müssen durch Vererbung von std:: iterator < std:: input_iterator_tag , T, Distance, const T * , const T & > erhalten werden.

(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)