std::istream_iterator
| Défini dans l'en-tête <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&>
|
(jusqu'à C++17) | |
template< class T,
class CharT = char,
class Traits = std::char_traits<CharT>,
class Distance = std::ptrdiff_t >
class istream_iterator;
|
(depuis C++17) | |
std::istream_iterator est un itérateur d'entrée à passage unique qui lit des objets successifs de type T à partir de l'objet std::basic_istream pour lequel il a été construit, en appelant l'opérateur operator>> approprié. L'opération de lecture réelle est effectuée lorsque l'itérateur est incrémenté, pas lorsqu'il est déréférencé. Le premier objet est lu lors de la construction de l'itérateur. Le déréférencement ne renvoie qu'une copie de l'objet le plus récemment lu.
Le std::istream_iterator construit par défaut est connu sous le nom d'itérateur de fin de flux. Lorsqu'un std::istream_iterator valide atteint la fin du flux sous-jacent, il devient égal à l'itérateur de fin de flux. Le déréférencer ou l'incrémenter davantage invoque un comportement indéfini. Un itérateur de fin de flux reste dans l'état de fin de flux même si le flux sous-jacent change d'état. En l'absence d'une réaffectation, il ne peut plus devenir un itérateur non-fin de flux.
Une implémentation typique de std::istream_iterator contient deux membres de données : un pointeur vers l'objet std::basic_istream associé et la valeur la plus récemment lue de type T.
T doit satisfaire aux exigences DefaultConstructible, CopyConstructible et CopyAssignable.
Types membres
| Type de membre | Définition |
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 > |
|
Les types membres
|
(jusqu'à C++17) |
Fonctions membres
construit un nouveau
istream_iterator
(fonction membre publique) |
|
détruit un
istream_iterator
, incluant la valeur mise en cache
(fonction membre publique) |
|
|
retourne l'élément courant
(fonction membre publique) |
|
|
avance l'itérateur
(fonction membre publique) |
Fonctions non membres
|
(supprimé en C++20)
|
compare deux
istream_iterator
s
(modèle de fonction) |
Notes
Lors de la lecture de caractères,
std::istream_iterator
ignore les espaces par défaut (sauf s'il est désactivé avec
std::noskipws
ou équivalent), tandis que
std::istreambuf_iterator
ne le fait pas. De plus,
std::istreambuf_iterator
est plus efficace, car il évite la surcharge de construction et de destruction de l'objet sentinelle à chaque caractère.
Exemple
#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
}
Sortie :
0.1 0.3 0.6 1
The first even number is 8.
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement tel que publié | Comportement correct |
|---|---|---|---|
| P0738R2 | C++98 | la première lecture pourrait être reportée jusqu'au premier déréférencement | toujours effectuée dans le constructeur |
Voir aussi
|
itérateur de sortie qui écrit vers
std::basic_ostream
(modèle de classe) |
|
|
itérateur d'entrée qui lit depuis
std::basic_streambuf
(modèle de classe) |