std::istream_iterator în C++

Iteratori C++98

Iterator care citește valori dintr-un flux de intrare (cin, fișier, stringstream) cu >>, până la final sau la o eroare.

Sintaxă
#include <iterator>

std::istream_iterator<T> it(flux);   // citește valori de tip T din flux
std::istream_iterator<T> sfarsit;    // iteratorul de final (implicit)

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; scrii vector<int> v(istream_iterator<int>(cin), istream_iterator<int>());. Compilatorul citește linia ca declarația unei funcții numite v („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 >>.