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 | typenameTraits::off_type |
pointer | /* unspecified */ |
reference | CharT |
char_type |
CharT |
traits_type |
Traits |
int_type | typenameTraits::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 (открытая функция-член) |
|
|
(destructor)
(implicitly declared) | уничтожает istreambuf_iterator (открытая функция-член) |
| получает копию текущего символа (открытая функция-член) |
|
| перемещает итератор вперёд (открытая функция-член) |
|
проверяет, достигли ли оба istreambuf_iterator конца потока или оба являются действительными (открытая функция-член) |
Функции, не являющиеся членами
|
(удалены в C++20) | сравнивает два istreambuf_iterator (шаблон функции) |
Примечания
Решение вопроса LWG 659 добавило operator->. Предполагается, что для std::istreambuf_iterator i выражения (*i).m и i->m имеют одинаковый эффект.
Однако это решение не содержит формальной спецификации поведения. Поэтому реализация различается: в частности, оператор может возвращать nullptr, возвращать адрес временного объекта или вообще не предоставлять этот член. Предполагаемое поведение практически невозможно обеспечить, и этот оператор был удалён решением вопроса LWG 2790.
Решение вопроса LWG 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++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 659 | C++98 | 1. std::istreambuf_iterator не имел operator->2. тип-член pointer был указан как CharT* | 1. добавлен 2. сделан неспецифицированным |
| LWG 2790 | C++98 | operator->, добавленный в вопросе LWG 659, был бесполезен | удалён |
См. также
выходной итератор, записывающий в std::basic_streambuf (шаблон класса) |
|
входной итератор, считывающий из std::basic_istream (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/istreambuf_iterator