Namensräume
Varianten
Aktionen

std::istreambuf_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 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 Ein-Durchlauf-Eingabe-Iterator, der sukzessive Zeichen aus dem std::basic_streambuf-Objekt liest, für das er konstruiert wurde.

Der standardkonstruierte 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. Das Dereferenzieren oder Inkrementieren ruft undefiniertes Verhalten auf.

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

(seit C++11)

Inhalt

[bearbeiten] Member-Typen

Mitgliedertyp Definition
iterator_category std::input_iterator_tag
value_type CharT
difference_type typename Traits::off_type
Zeiger /* nicht spezifiziert */
Referenz 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 */ Implementierungsdefinierten Klassentyp.
Ein Proxy-Objekt speichert ein char_type-Zeichen und einen streambuf_type*-Zeiger.
Das Dereferenzieren eines Proxy-Objekts mit operator* liefert das gespeicherte Zeichen.
((nur zur Veranschaulichung)*)

Die Membertypen 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, /* nicht spezifiziert */, CharT> bezogen werden.

(bis C++17)

Der Membertyp pointer ist üblicherweise CharT* (siehe unten).

[edit] Memberfunktionen

konstruiert einen neuen istreambuf_iterator
(öffentliche Memberfunktion) [edit]
(Destruktor)
(implizit deklariert)
destruiert einen istreambuf_iterator
(öffentliche Memberfunktion) [edit]
holt eine Kopie des aktuellen Zeichens
(öffentliche Memberfunktion) [edit]
bewegt den Iterator vorwärts
(öffentliche Memberfunktion) [edit]
prüft, ob beide istreambuf_iterators End-of-Stream sind oder ob beide gültig sind
(öffentliche Memberfunktion) [edit]

[edit] Nicht-Memberfunktionen

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

[edit] Anmerkungen

Die Auflösung von LWG-Problem 659 führte den operator-> ein. Es wird erwartet, dass für einen std::istreambuf_iterator i die Ausdrücke (*i).m und i->m die gleiche Wirkung haben.

Die Auflösung liefert jedoch keine formale Spezifikation seines Verhaltens. Daher wird es unterschiedlich implementiert, z. B. durch Rückgabe von nullptr, Rückgabe der Adresse eines temporären Objekts oder durch gar keine Bereitstellung des Members. Sein beabsichtigtes Verhalten kann kaum erreicht werden und es wurde durch die Auflösung von LWG-Problem 2790 entfernt.

Die Auflösung von LWG-Problem 659 machte auch den Membertyp pointer nicht spezifiziert, um operator-> die Rückgabe eines Proxy zu ermöglichen. Dies dient dazu, operator-> kompilieren zu lassen, wenn CharT kein Klassentyp ist.

[edit] Beispiel

#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
 
int main()
{
    // typical use case: an input stream represented as a pair of iterators
    std::istringstream in{"Hello, world"};
    std::istreambuf_iterator<char> it{in}, end;
    std::string ss{it, end};
    std::cout << "ss has " << ss.size() << " bytes; "
                 "it holds \"" << ss << "\"\n";
 
    // demonstration of the single-pass nature
    std::istringstream s{"abc"};
    std::istreambuf_iterator<char> i1{s}, i2{s};
    std::cout << "i1 returns '" << *i1 << "'\n"
                 "i2 returns '" << *i2 << "'\n";
 
    ++i1;
    std::cout << "after incrementing i1, but not i2:\n"
                 "i1 returns '" << *i1 << "'\n"
                 "i2 returns '" << *i2 << "'\n";
 
    ++i2;
    std::cout << "after incrementing i2, but not i1:\n"
                 "i1 returns '" << *i1 << "'\n"
                 "i2 returns '" << *i2 << "'\n";
}

Ausgabe

ss has 12 bytes; it holds "Hello, world"
i1 returns 'a'
i2 returns 'a'
after incrementing i1, but not i2:
i1 returns 'b'
i2 returns 'b'
after incrementing i2, but not i1:
i1 returns 'c'
i2 returns 'c'

[edit] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 659 C++98 1. std::istreambuf_iterator hatte keinen operator->
2. der Membertyp pointer war als CharT* spezifiziert
1. hinzugefügt
2. wurde nicht spezifiziert
LWG 2790 C++98 der durch LWG-Problem 659 hinzugefügte operator-> war nicht nützlich entfernt

[edit] Siehe auch

Ausgabe-Iterator, der in std::basic_streambuf schreibt
(Klassenvorlage) [bearbeiten]
Eingabe-Iterator, der aus std::basic_istream liest
(Klassenvorlage) [bearbeiten]