Namespaces
Variants

std:: istreambuf_iterator

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(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 ,

/* no especificado */ , 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 una sola pasada que lee caracteres sucesivos del std::basic_streambuf para el cual fue construido.

El constructor por defecto de std::istreambuf_iterator se conoce como el iterador de fin-de-flujo . Cuando un std::istreambuf_iterator alcanza el final del flujo subyacente, se vuelve igual al iterador de fin-de-flujo. Desreferenciarlo o incrementarlo más allá invoca comportamiento indefinido.

std::istreambuf_iterator tiene un constructor de copia trivial, un constructor predeterminado constexpr y un destructor trivial.

(desde C++11)

Contenidos

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)