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> |
|
Типы членов |
(до C++17) |
Члены-функции
создаёт новый istream_iterator (общедоступная функция-член) |
|
уничтожает istream_iterator, включая кэшированное значение (общедоступная функция-член) |
|
| возвращает текущий элемент (общедоступная функция-член) |
|
| перемещает итератор (общедоступная функция-член) |
Функции вне класса
|
(удалено в 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 (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/istream_iterator