std::istreambuf_iterator
Определено в заголовке <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,
/* unspecified */, CharT>
|
(до C++17) | |
template< class CharT, class Traits = std::char_traits<CharT> > class istreambuf_iterator; |
(с C++17) |
std::istreambuf_iterator — это итератор поточного ввода, который считывает последовательные символы из объекта std::basic_streambuf, для которого он был сконструирован.
Итератор std::istreambuf_iterator, сконструированный по умолчанию, известен как итератор конца потока. Когда допустимый итератор std::istreambuf_iterator достигает конца базового потока, он становится равен итератору конца потока. Обращение к нему или дальнейшее его инкрементирование приводит к неопределённому поведению.
|
|
(с C++11) |
Типы-члены
| Тип-член | Определение |
|---|---|
iterator_category |
std::input_iterator_tag |
value_type |
CharT |
difference_type |
typename Traits::off_type |
pointer |
/* не определено */ |
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 предназначено только для демонстрации.Объект proxy хранит символ char_type и указатель streambuf_type*.Обращение к объекту proxy с помощью operator* возвращает сохранённый символ. |
|
Типы-члены |
(до C++17) |
Тип-член pointer обычно равен CharT* (см. ниже).
Члены-функции
создаёт новый istreambuf_iterator (публичная функция-член) |
|
|
(деструктор)
(неявно объявлен)
|
уничтожает istreambuf_iterator (публичная функция-член) |
| получает копию текущего символа (публичная функция-член) |
|
| переводит итератор вперёд (публичная функция-член) |
|
проверяет, являются ли оба итератора istreambuf_iterator итераторами конца потока, или оба являются допустимыми (публичная функция-член) |
Функции, не являющиеся членами
|
(удалено в C++20)
|
сравнивает два istreambuf_iterator (шаблон функции) |
Примечания
Решение проблемы LWG issue 659 ввело оператор ->. Ожидается, что при заданном std::istreambuf_iterator i, выражения (*i).m и i->m имеют одинаковый эффект.
Однако решение не предоставляет формального описания его поведения. Таким образом, его реализация может отличаться, включая возврат nullptr, возврат адреса временной переменной или даже полное отсутствие этого члена. Его предполагаемое поведение сложно достичь, и оно было удалено в решении LWG issue 2790.
Решение LWG issue 659 также сделало тип-член pointer не определённым, чтобы разрешить operator-> возвращать прокси. Это позволяет operator-> компилироваться, когда CharT не является типом класса.
Пример
#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";
}Вывод:
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'
Отчёты об ошибках
Следующие отчёты об ошибках, меняющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применимо к | Поведение, как опубликовано | Корректное поведение |
|---|---|---|---|
| LWG 659 | C++98 | 1. std::istreambuf_iterator не имел оператора->2. тип-член pointer был задан как CharT* |
1. добавлен 2. не определён |
| LWG 2790 | C++98 | оператор->, добавленный LWG issue 659, не был полезен | удален |
См. также
итератор вывода, записывающий в std::basic_streambuf (шаблон класса) |
|
итератор ввода, считывающий из std::basic_istream (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/istreambuf_iterator