Spec-Zone.ru › C++

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 достигает конца базового потока, он становится равным итератору конца потока. Дальнейшее разыменование или увеличение такого итератора приводит к неопределённому поведению.

std::istreambuf_iterator имеет тривиальный конструктор копирования, constexpr-конструктор по умолчанию и тривиальный деструктор.

(начиная с 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* возвращает сохранённый символ.
(тип-член только для описания*)

Типы-члены iterator_category, value_type, difference_type, pointer и reference должны быть получены путём наследования от std::iterator<std::input_iterator_tag,CharT,typenameTraits::off_type,/* unspecified */,CharT>.

(до C++17)

Тип-член pointer обычно является CharT* (см. ниже).

Функции-члены

(constructor)
создаёт новый istreambuf_iterator
(открытая функция-член)
(destructor)
(implicitly declared)
уничтожает istreambuf_iterator
(открытая функция-член)
operator*
получает копию текущего символа
(открытая функция-член)
operator++operator++(int)
перемещает итератор вперёд
(открытая функция-член)
equal
проверяет, достигли ли оба istreambuf_iterator конца потока или оба являются действительными
(открытая функция-член)

Функции, не являющиеся членами

operator==operator!=
(удалены в 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, был бесполезен удалён

См. также

ostreambuf_iterator
выходной итератор, записывающий в std::basic_streambuf
(шаблон класса)
istream_iterator
входной итератор, считывающий из std::basic_istream
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/istreambuf_iterator

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API