Namespaces
Variants

std::istreambuf_iterator

De es.cppreference.net
 
 
Biblioteca de iteradores
Conceptos de iteradores
Primitivas de iterador
Conceptos y utilidades de algoritmos
Conceptos invocables indirectos
Requisitos comunes de algoritmos
(C++20)
(C++20)
(C++20)
Utilidades
(C++20)
Adaptadores de iterador
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 CharT, class Traits = std::char_traits<CharT> >
class istreambuf_iterator
    : public std::iterator<std::input_iterator_tag,
                           CharT, typename Traits::off_type,
                           /* unspecified */, CharT>
(hasta C++17)
template< class CharT, class Traits = std::char_traits<CharT> >
class istreambuf_iterator;
(desde C++17)

std::istreambuf_iterator es un iterador de entrada de un solo paso que lee caracteres sucesivos del objeto std::basic_streambuf para el cual fue construido.

El std::istreambuf_iterator construido por defecto se conoce como el iterador de fin de flujo. Cuando un std::istreambuf_iterator llega al final del flujo subyacente, se vuelve igual al iterador de fin de flujo. Desreferenciarlo o incrementarlo posteriormente invoca un comportamiento indefinido.

std::istreambuf_iteratorTiene un constructor de copia trivial, un constructor por defecto constexpr y un destructor trivial.

(desde C++11)

Tipos de miembros

Tipo de miembro Definición
iterator_category std:: input_iterator_tag
value_type CharT
difference_type typename Traits :: off_type
pointer /* unspecified */
reference CharT
char_type CharT
traits_type Traits
int_type typename Traits :: int_type
streambuf_type std:: basic_streambuf < CharT, Traits >
istream_type std:: basic_istream < CharT, Traits >
/* proxy */ Tipo de clase definido por la implementación.
Un objeto proxy contiene un carácter char_type y un puntero streambuf_type* .
Desreferenciar un objeto proxy con operator* produce el carácter almacenado.
( tipo de miembro solo para exposición* )

Los tipos de miembro iterator_category , value_type , difference_type , pointer y reference deben obtenerse heredando de std:: iterator < std:: input_iterator_tag , CharT, typename Traits :: off_type , /* no especificado */ , CharT > .

(hasta C++17)

El tipo miembro pointer normalmente es CharT* (ver abajo ).

Funciones miembro

construye un nuevo istreambuf_iterator
(función miembro pública)
(destructor)
(implicitly declared)
destruye un istreambuf_iterator
(función miembro pública)
obtiene una copia del carácter actual
(función miembro pública)
avanza el iterador
(función miembro pública)
comprueba si ambos istreambuf_iterator s son de fin-de-flujo o si ambos son válidos
(función miembro pública)

Funciones no miembro

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

Notas

La resolución de LWG issue 659 introdujo operator - > . Se espera que dado un std::istreambuf_iterator i , las expresiones ( * i ) . m y i - > m tengan el mismo efecto.

Sin embargo, la resolución no proporciona una especificación formal de su comportamiento. Por lo tanto, se implementa de manera diferente, incluyendo devolver nullptr , devolver la dirección de un temporal, o incluso no proporcionar el miembro en absoluto. Su comportamiento previsto difícilmente puede lograrse, y se elimina mediante la resolución de LWG issue 2790 .

La resolución de LWG issue 659 también hizo que el tipo miembro pointer no esté especificado para permitir que operator-> devuelva un proxy. Esto permite que operator-> compile cuando CharT no es un tipo clase.

Ejemplo

#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
int main()
{
    // caso de uso típico: un flujo de entrada representado como un par de iteradores
    std::istringstream in{"Hello, world"};
    std::istreambuf_iterator<char> it{in}, end;
    std::string ss{it, end};
    std::cout << "ss tiene " << ss.size() << " bytes; "
                 "contiene \"" << ss << "\"\n";
    // demostración de la naturaleza de paso único
    std::istringstream s{"abc"};
    std::istreambuf_iterator<char> i1{s}, i2{s};
    std::cout << "i1 devuelve '" << *i1 << "'\n"
                 "i2 devuelve '" << *i2 << "'\n";
    ++i1;
    std::cout << "después de incrementar i1, pero no i2:\n"
                 "i1 devuelve '" << *i1 << "'\n"
                 "i2 devuelve '" << *i2 << "'\n";
    ++i2;
    std::cout << "después de incrementar i2, pero no i1:\n"
                 "i1 devuelve '" << *i1 << "'\n"
                 "i2 devuelve '" << *i2 << "'\n";
}

Salida:

ss tiene 12 bytes; contiene "Hello, world"
i1 devuelve 'a'
i2 devuelve 'a'
después de incrementar i1, pero no i2:
i1 devuelve 'b'
i2 devuelve 'b'
después de incrementar i2, pero no i1:
i1 devuelve 'c'
i2 devuelve 'c'

Informes de defectos

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

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 659 C++98 1. std::istreambuf_iterator no tenía operator - >
2. el tipo miembro pointer se especificaba como CharT*
1. añadido
2. hecho no especificado
LWG 2790 C++98 el operator - > añadido por LWG issue 659 no era útil eliminado

Véase también

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