Namensräume
Varianten
Aktionen

std:: istream_iterator

Von cppreference.com
< cpp‎ | iterator
 
 
Iterator-Bibliothek
Iterator-Konzepte
Iterator-Primitive
Algorithmus-Konzepte und Hilfsprogramme
Indirekte aufrufbare Konzepte
Gemeinsame Algorithmus-Anforderungen
(C++20)
(C++20)
(C++20)
Dienstprogramme
(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 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 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&> bezogen werden.

(bis C++17)

[edit] Memberfunktionen

konstruiert einen neuen istream_iterator
(public member function) [edit]
destruiert einen istream_iterator, einschließlich des gecachten Werts
(public member function) [edit]
gibt das aktuelle Element zurück
(public member function) [edit]
bewegt den Iterator vorwärts
(public member function) [edit]

[edit] Nicht-Member-Funktionen

(in C++20 entfernt)
vergleicht zwei istream_iterators
(function template) [bearbeiten]

[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) [bearbeiten]
Eingabe-Iterator, der aus std::basic_streambuf liest
(Klassenvorlage) [bearbeiten]