Namespaces
Variants

std::istream_iterator

Начиная с ru.cppreference.net
 
 
Библиотека итераторов
Концепции итераторов
Примитивы итераторов
(устарело в C++17)


Концепции и утилиты алгоритмов
Концепции косвенного вызова
Общие требования алгоритмов
(C++20)
(C++20)
(C++20)
Утилиты
(C++20)
Адаптеры итераторов
Доступ к диапазону
(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 T,
          class CharT = char,
          class Traits = std::char_traits<CharT>,
          class Distance = std::ptrdiff_t >
class istream_iterator
    : public std::iterator<std::input_iterator_tag, T, Distance, const T*, const T&>
(до C++17)
template< class T,
          class CharT = char,
          class Traits = std::char_traits<CharT>,
          class Distance = std::ptrdiff_t >
class istream_iterator;
(начиная с C++17)

std::istream_iterator — это однопроходный входной итератор, который читает последовательные объекты типа T из объекта std::basic_istream, с которым он был сконструирован, вызывая соответствующую функцию operator>>. Фактическая операция чтения выполняется при инкрементировании итератора, а не при его разыменовании. Первый объект читается при конструировании итератора. Разыменование возвращает только копию самого последнего прочитанного объекта.

По умолчанию сконструированный std::istream_iterator известен как итератор конца потока. Когда допустимый std::istream_iterator достигает конца основного потока, он становится равен итератору конца потока. Дальнейшее разыменование или инкрементирование вызывает неопределённое поведение. Итератор конца потока остаётся в состоянии конца потока, даже если основной поток меняет своё состояние. При отсутствии переназначения он больше не может стать итератором, не указывающим на конец потока.

Типичная реализация std::istream_iterator содержит два элемента данных: указатель на связанный объект std::basic_istream и самое последнее прочитанное значение типа T.

T должен удовлетворять требованиям DefaultConstructible, CopyConstructible и CopyAssignable.

Типы членов

Тип члена Определение
iterator_category std:: input_iterator_tag
value_type T
difference_type Distance
pointer const T *
reference const T &
char_type CharT
traits_type Traits
istream_type std:: basic_istream < CharT, Traits >

Типы членов iterator_category , value_type , difference_type , pointer и reference должны быть получены путем наследования от std:: iterator < std:: input_iterator_tag , T, Distance, const T * , const T & > .

(до C++17)

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

создает новый istream_iterator
(public member function)
уничтожает istream_iterator , включая кэшированное значение
(public member function)
возвращает текущий элемент
(public member function)
перемещает итератор вперед
(public member function)

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

(удалено в C++20)
сравнивает два istream_iterator а
(шаблон функции)

Примечания

При чтении символов std::istream_iterator по умолчанию пропускает пробельные символы (если не отключено с помощью std::noskipws или эквивалента), тогда как std::istreambuf_iterator этого не делает. Кроме того, std::istreambuf_iterator более эффективен, поскольку избегает накладных расходов на создание и уничтожение сторожевого объекта для каждого символа.

Пример

#include <algorithm>
#include <iostream>
#include <iterator>
#include <numeric>
#include <sstream>

int main()
{
    std::istringstream str("0.1 0.2 0.3 0.4");
    std::partial_sum(std::istream_iterator<double>(str),
                     std::istream_iterator<double>(),
                     std::ostream_iterator<double>(std::cout, " "));
    
    std::istringstream str2("1 3 5 7 8 9 10");
    auto it = std::find_if(std::istream_iterator<int>(str2),
                           std::istream_iterator<int>(),
                           [](int i){ return i % 2 == 0; });
    
    if (it != std::istream_iterator<int>())
        std::cout << "\nThe first even number is " << *it << ".\n";
    //" 9 10" left in the stream
}

Результат:

0.1 0.3 0.6 1
The first even number is 8.

Отчеты о дефектах

Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение как опубликовано Корректное поведение
P0738R2 C++98 первое чтение может быть отложено до первого разыменования всегда выполняется в конструкторе

Смотрите также

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