std:: istreambuf_iterator
|
Определено в заголовочном файле
<iterator>
|
||
|
template
<
class
CharT,
class
Traits
=
std::
char_traits
<
CharT
>
>
class
istreambuf_iterator
|
(до 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
(шаблон класса) |