Namespaces
Variants

std:: istreambuf_iterator

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
Определено в заголовочном файле <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 /* 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* возвращает сохранённый символ.
( тип члена только для демонстрации* )

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

(до 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
(шаблон класса)