Namespaces
Variants

std::istream_iterator

De es.cppreference.net
 
 
Biblioteca de iteradores
Conceptos de iteradores
Primitivas de iteradores
Conceptos y utilidades de algoritmos
Conceptos invocables indirectos
Requisitos comunes de algoritmos
(C++20)
(C++20)
(C++20)
Utilidades
(C++20)
Adaptadores de iteradores
Acceso a rangos
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
 
Definido en el encabezado <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&>
(hasta C++17)
template< class T,
          class CharT = char,
          class Traits = std::char_traits<CharT>,
          class Distance = std::ptrdiff_t >
class istream_iterator;
(desde C++17)

std::istream_iterator es un iterador de entrada de una sola pasada que lee objetos sucesivos de tipo T desde el objeto std::basic_istream para el cual fue construido, llamando al operator>> apropiado. La operación de lectura real se realiza cuando el iterador se incrementa, no cuando se desreferencia. El primer objeto se lee cuando se construye el iterador. Desreferenciar solo devuelve una copia del objeto leído más recientemente.

El std::istream_iterator construido por defecto se conoce como el iterador fin de flujo. Cuando un std::istream_iterator válido llega al final del flujo subyacente, se vuelve igual al iterador de fin de flujo. Desreferenciarlo o incrementarlo más allá invoca un comportamiento indefinido. Un iterador de fin de flujo permanece en el estado de fin de flujo incluso si el flujo subyacente cambia de estado. Sin una reasignación, ya no puede convertirse en un iterador que no sea de fin de flujo.

Una implementación típica de std::istream_iterator contiene dos miembros de datos: un puntero al objeto std::basic_istream asociado y el valor leído más recientemente de tipo T.

T debe cumplir los requisitos DefaultConstructible, CopyConstructible y CopyAssignable.

Tipos de miembros

Tipo de miembro Definición
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 >

Los tipos de miembro iterator_category , value_type , difference_type , pointer y reference deben obtenerse heredando de std:: iterator < std:: input_iterator_tag , T, Distance, const T * , const T & > .

(hasta C++17)

Funciones miembro

construye un nuevo istream_iterator
(función miembro pública)
destruye un istream_iterator , incluyendo el valor almacenado en caché
(función miembro pública)
devuelve el elemento actual
(función miembro pública)
avanza el iterador
(función miembro pública)

Funciones no miembro

(eliminado en C++20)
compara dos istream_iterator s
(plantilla de función)

Notas

Al leer caracteres, std::istream_iterator omite los espacios en blanco por defecto (a menos que se desactive con std::noskipws o equivalente), mientras que std::istreambuf_iterator no lo hace. Además, std::istreambuf_iterator es más eficiente, ya que evita la sobrecarga de construir y destruir el objeto centinela una vez por carácter.

Ejemplo

#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
}

Salida:

0.1 0.3 0.6 1
The first even number is 8.

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
P0738R2 C++98 la primera lectura podría diferirse hasta la primera desreferenciación siempre se realiza en el constructor

Véase también

iterador de salida que escribe en std::basic_ostream
(plantilla de clase)
iterador de entrada que lee desde std::basic_streambuf
(plantilla de clase)