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
|
/* 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 */
|
Тип класса, определяемый реализацией.
Объект
proxy
содержит символ
char_type
и указатель
streambuf_type*
.
Разыменование объекта
proxy
с помощью
operator*
возвращает сохранённый символ.
( тип члена только для демонстрации* ) |
|
Типы членов
|
(до C++17) |
Тип-член
pointer
обычно является
CharT*
(см.
ниже
).
Функции-члены
создает новый
istreambuf_iterator
(public member function) |
|
|
(destructor)
(implicitly declared)
|
уничтожает
istreambuf_iterator
(public member function) |
|
получает копию текущего символа
(public member function) |
|
|
продвигает итератор
(public member function) |
|
проверяет, являются ли оба
istreambuf_iterator
концом потока или оба действительны
(public member function) |
Функции, не являющиеся членами класса
|
(удалено в C++20)
|
сравнивает два
istreambuf_iterator
а
(шаблон функции) |
Примечания
Разрешение
проблемы LWG 659
ввело
operator
-
>
. Ожидается, что для
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() { // типичный случай использования: входной поток, представленный в виде пары итераторов 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"; // демонстрация однопроходной природы 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 | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 659 | C++98 |
1.
std::istreambuf_iterator
did not have
operator
-
>
2. the member type
pointer
was specified as
CharT*
|
1. добавлен
2. сделан неопределённым |
| LWG 2790 | C++98 | the operator - > added by LWG issue 659 was not useful | удалён |
Смотрите также
|
выходной итератор, который записывает в
std::basic_streambuf
(шаблон класса) |
|
|
входной итератор, который читает из
std::basic_istream
(шаблон класса) |