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 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* возвращает сохранённый символ.

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

(до C++17)

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

Члены-функции

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

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

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

См. также

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/w/cpp/iterator/istreambuf_iterator

Spec-Zone.ru

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