std::istream_iterator
| 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
|
(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) |