std:: istream_iterator
|
Défini dans l'en-tête
<iterator>
|
||
|
template
<
class
T,
class
CharT
=
char
,
|
(jusqu'à C++17) | |
|
template
<
class
T,
class
CharT
=
char
,
|
(depuis C++17) | |
std::istream_iterator
est un itérateur d'entrée à passage unique qui lit des objets successifs de type
T
depuis l'objet
std::basic_istream
pour lequel il a été construit, en appelant l'
operator
>>
approprié. L'opération de lecture effective est réalisée lorsque l'itérateur est incrémenté, et non lors de son déréférencement. 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érencement ou l'incrémentation ultérieure
invoque un comportement indéfini.
Un itérateur de fin de flux reste dans l'état de fin de flux
même si l'état du flux sous-jacent change.
En l'absence de réaffectation,
il ne peut plus redevenir 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
.
Table des matières |
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) |