std:: istream_iterator
|
Определено в заголовке
<iterator>
|
||
|
template
<
class
T,
class
CharT
=
char
,
|
(до C++17) | |
|
template
<
class
T,
class
CharT
=
char
,
|
(начиная с 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
(шаблон класса) |