std::istreambuf_iterator
| Definiert in Header <iterator> |
||
| template< class CharT, class Traits = std::char_traits<CharT> > class istreambuf_iterator |
(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.
|
|
(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 |
(bis C++17) |
Der Membertyp pointer ist üblicherweise CharT* (siehe unten).
[edit] Memberfunktionen
konstruiert einen neuen istreambuf_iterator(öffentliche Memberfunktion) | |
| (Destruktor) (implizit deklariert) |
destruiert einen istreambuf_iterator(öffentliche Memberfunktion) |
| holt eine Kopie des aktuellen Zeichens (öffentliche Memberfunktion) | |
| bewegt den Iterator vorwärts (öffentliche Memberfunktion) | |
prüft, ob beide istreambuf_iterators End-of-Stream sind oder ob beide gültig sind(öffentliche Memberfunktion) |
[edit] Nicht-Memberfunktionen
| (in C++20 entfernt) |
vergleicht zwei istreambuf_iterators(function template) |
[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) | |
| Eingabe-Iterator, der aus std::basic_istream liest (Klassenvorlage) |