std:: istream_iterator
|
Definido en el encabezado
<iterator>
|
||
|
template
<
class
T,
class
CharT
=
char
,
|
(hasta C++17) | |
|
template
<
class
T,
class
CharT
=
char
,
|
(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 es incrementado, no cuando se desreferencia. El primer objeto se lee cuando el iterador es construido. Desreferenciar solo devuelve una copia del objeto más recientemente leído.
El constructor por defecto de
std::istream_iterator
se conoce como el iterador de
fin-de-flujo
. Cuando un
std::istream_iterator
válido alcanza el final del flujo subyacente, se vuelve igual al iterador de fin-de-flujo. Desreferenciarlo o incrementarlo más allá invoca 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, no puede volver a ser un iterador que no sea de fin-de-flujo.
Una implementación típica de
std::istream_iterator
mantiene dos miembros de datos: un puntero al objeto
std::basic_istream
asociado y el valor más recientemente leído de tipo
T
.
T
debe cumplir con los requisitos
DefaultConstructible
,
CopyConstructible
, y
CopyAssignable
.
Contenidos |
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 << "\nEl primer número par es " << *it << ".\n"; //" 9 10" left in the stream }
Salida:
0.1 0.3 0.6 1 El primer número par es 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) |