Spec-Zone.ru › C++

std::istream_iterator

Определено в заголовке <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, для которого он был создан, вызывая соответствующий оператор >>. Фактическая операция чтения выполняется при увеличении итератора, а не при его разыменовании. Первый объект считывается при создании итератора. Разъименование возвращает только копию наиболее недавно прочитанного объекта.

Итератор 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
(общедоступная функция-член)
(деструктор)
уничтожает istream_iterator, включая кэшированное значение
(общедоступная функция-член)
operator*operator->
возвращает текущий элемент
(общедоступная функция-член)
operator++operator++(int)
перемещает итератор
(общедоступная функция-член)

Функции вне класса

operator==operator!=
(удалено в 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 первое чтение может быть отложено до первого разыменования всегда выполняется в конструкторе

См. также

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

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

Spec-Zone.ru

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