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, с которым он был сконструирован, вызывая соответствующую функцию 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 > |
|
Типы членов
|
(до 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
(шаблон класса) |