Namespaces
Variants

std:: istreambuf_iterator

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(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 im Header <iterator>
template < class CharT, class Traits = std:: char_traits < CharT > >

class istreambuf_iterator
: public std:: iterator < std:: input_iterator_tag ,
CharT, typename Traits :: off_type ,

/* nicht spezifiziert */ , CharT >
(bis C++17)
template < class CharT, class Traits = std:: char_traits < CharT > >
class istreambuf_iterator ;
(seit C++17)

std::istreambuf_iterator ist ein Einweg-Eingabeiterator, der aufeinanderfolgende Zeichen aus dem std::basic_streambuf -Objekt liest, für das er konstruiert wurde.

Der standardmäßig konstruierte std::istreambuf_iterator wird als End-of-Stream-Iterator bezeichnet. Wenn ein std::istreambuf_iterator das Ende des zugrunde liegenden Streams erreicht, wird er gleich dem End-of-Stream-Iterator. Ein weiteres Dereferenzieren oder Inkrementieren ruft undefiniertes Verhalten hervor.

std::istreambuf_iterator hat einen trivialen Kopierkonstruktor, einen constexpr-Standardkonstruktor und einen trivialen Destruktor.

(seit C++11)

Inhaltsverzeichnis

Mitgliedertypen

Mitgliedertyp Definition
iterator_category std:: input_iterator_tag
value_type CharT
difference_type typename Traits :: off_type
pointer /* unspecified */
reference CharT
char_type CharT
traits_type Traits
int_type typename Traits :: int_type
streambuf_type std:: basic_streambuf < CharT, Traits >
istream_type std:: basic_istream < CharT, Traits >
/* proxy */ Implementierungsdefinierter Klassentyp.
Ein proxy -Objekt enthält ein char_type -Zeichen und einen streambuf_type* -Zeiger.
Das Dereferenzieren eines proxy -Objekts mit operator* liefert das gespeicherte Zeichen.
( Nur zur Veranschaulichung dienender Mitgliedertyp* )

Die Member-Typen iterator_category , value_type , difference_type , pointer und reference müssen durch Vererbung von std:: iterator < std:: input_iterator_tag , CharT, typename Traits :: off_type , /* unspecified */ , CharT > erhalten werden.

(bis C++17)

Der Member-Typ pointer ist normalerweise CharT* (siehe unten ).

Memberfunktionen

konstruiert einen neuen istreambuf_iterator
(public member function)
(destructor)
(implicitly declared)
zerstört einen istreambuf_iterator
(public member function)
erhält eine Kopie des aktuellen Zeichens
(public member function)
bewegt den Iterator vorwärts
(public member function)
prüft, ob beide istreambuf_iterator s End-of-Stream sind oder beide gültig sind
(public member function)

Nicht-Member-Funktionen

(entfernt in C++20)
vergleicht zwei istreambuf_iterator s
(Funktions-Template)

Hinweise

Die Lösung von LWG Issue 659 führte operator - > ein. Es wird erwartet, dass für einen std::istreambuf_iterator i die Ausdrücke ( * i ) . m und i - > m denselben Effekt haben.

Allerdings bietet die Resolution keine formale Spezifikation ihres Verhaltens. Daher wird sie unterschiedlich implementiert, einschließlich der Rückgabe von nullptr , der Rückgabe der Adresse eines temporären Objekts oder dem vollständigen Fehlen des Members. Das beabsichtigte Verhalten ist kaum zu erreichen, und es wurde durch die Resolution von LWG issue 2790 entfernt.

Die Lösung von LWG Issue 659 machte auch den Member-Typ pointer nicht spezifiziert, um zu ermöglichen, dass operator-> einen Proxy zurückgibt. Dies ermöglicht es operator-> zu kompilieren, wenn CharT kein Klassentyp ist.

Beispiel

#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
int main()
{
    // Typischer Anwendungsfall: Ein Eingabestrom dargestellt als Iteratorpaar
    std::istringstream in{"Hello, world"};
    std::istreambuf_iterator<char> it{in}, end;
    std::string ss{it, end};
    std::cout << "ss hat " << ss.size() << " Bytes; "
                 "it enthält \"" << ss << "\"\n";
    // Demonstration des Single-Pass-Verhaltens
    std::istringstream s{"abc"};
    std::istreambuf_iterator<char> i1{s}, i2{s};
    std::cout << "i1 gibt '" << *i1 << "' zurück\n"
                 "i2 gibt '" << *i2 << "' zurück\n";
    ++i1;
    std::cout << "nach Inkrementieren von i1, aber nicht i2:\n"
                 "i1 gibt '" << *i1 << "' zurück\n"
                 "i2 gibt '" << *i2 << "' zurück\n";
    ++i2;
    std::cout << "nach Inkrementieren von i2, aber nicht i1:\n"
                 "i1 gibt '" << *i1 << "' zurück\n"
                 "i2 gibt '" << *i2 << "' zurück\n";
}

Ausgabe:

ss hat 12 Bytes; it enthält "Hello, world"
i1 gibt 'a' zurück
i2 gibt 'a' zurück
nach Inkrementieren von i1, aber nicht i2:
i1 gibt 'b' zurück
i2 gibt 'b' zurück
nach Inkrementieren von i2, aber nicht i1:
i1 gibt 'c' zurück
i2 gibt 'c' zurück

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
LWG 659 C++98 1. std::istreambuf_iterator hatte kein operator - >
2. der Member-Typ pointer war als CharT* spezifiziert
1. hinzugefügt
2. als unspezifiziert festgelegt
LWG 2790 C++98 der durch LWG Issue 659 hinzugefügte operator - > war nicht nützlich entfernt

Siehe auch

Ausgabe-Iterator, der in std::basic_streambuf schreibt
(Klassentemplate)
Eingabe-Iterator, der aus std::basic_istream liest
(Klassentemplate)