Ce face std::istream_iterator
std::istream_iterator<T> transformă un flux într-o secvență de valori: fiecare ++ citește următoarea valoare cu >>. Un iterator creat fără argumente reprezintă „sfârșitul”: citirea se oprește când fluxul se termină sau când întâlnește ceva ce nu poate fi citit ca T.
Așa poți citi toate numerele dintr-un flux direct într-un vector, cu un singur constructor, sau poți folosi algoritmi direct pe intrare. Ca și >>, sare peste spații și linii noi.
Parametri
| Parametru | Descriere |
|---|---|
T |
Tipul valorilor citite (int, double, std::string…). |
flux |
Fluxul de intrare: std::cin, un std::ifstream, un std::istringstream. |
Ce returnează
Un iterator de intrare; *it este ultima valoare citită.
Exemple
Exemplul 1: Toate numerele de la tastatură într-un vector
#include <iostream>
#include <iterator>
#include <numeric>
#include <print>
#include <vector>
int main() {
std::vector<int> v{std::istream_iterator<int>(std::cin), std::istream_iterator<int>()};
std::println("Am citit {} numere: {}", v.size(), v);
std::println("Suma: {}", std::accumulate(v.begin(), v.end(), 0));
}
Ce scrie utilizatorul (intrare)
12 7 30
5 18
Rezultat
Am citit 5 numere: [12, 7, 30, 5, 18]
Suma: 72
Exemplul 2: Citire dintr-un text până la primul element invalid
#include <iterator>
#include <print>
#include <sstream>
#include <string>
#include <vector>
int main() {
std::istringstream sursa("3.5 2.25 10 abc 7");
std::vector<double> valori(std::istream_iterator<double>{sursa}, std::istream_iterator<double>{});
std::println("{}", valori); // se oprește la "abc"
std::istringstream cuvinte("Ana are mere");
std::vector<std::string> lista(std::istream_iterator<std::string>{cuvinte}, {});
std::println("{}", lista);
}
Rezultat
[3.5, 2.25, 10]
["Ana", "are", "mere"]
Greșeli frecvente
- Cu
using namespace std;scriivector<int> v(istream_iterator<int>(cin), istream_iterator<int>());. Compilatorul citește linia ca declarația unei funcții numitev(„most vexing parse”), nu ca un vector. Folosește acolade:vector<int> v{istream_iterator<int>(cin), istream_iterator<int>()};. - Te aștepți ca citirea să continue după o valoare invalidă. Fluxul intră în stare de eroare și iteratorul devine egal cu sfârșitul.
Comenzi înrudite
std::ostream_iterator: Iterator care scrie fiecare valoare primită într-un flux de ieșire (cout, fișier), urmată de un separator.std::back_inserter: Iteratori de inserare: fiecare scriere prin back_inserter face push_back, iar prin inserter face insert la o poziție.std::cin: Citește valori de la tastatură în variabile, cu operatorul >>.