std::ostream_iterator în C++

Iteratori C++98

Iterator care scrie fiecare valoare primită într-un flux de ieșire (cout, fișier), urmată de un separator.

Sintaxă
#include <iterator>

std::ostream_iterator<T> it(flux);
std::ostream_iterator<T> it(flux, "separator");

Ce face std::ostream_iterator

std::ostream_iterator<T> este destinația perfectă pentru algoritmi care produc valori: fiecare atribuire prin el face flux << valoare << separator. Cu std::copy poți afișa un container întreg dintr-o singură linie, fără buclă.

Separatorul este scris după fiecare element, inclusiv după ultimul. În C++23, pentru afișarea simplă a unui container, std::println("{}", v) sau std::println("{:n}", v) (fără paranteze) sunt de obicei mai comode.

Parametri

Parametru Descriere
T Tipul valorilor scrise.
flux Fluxul de ieșire: std::cout, un std::ofstream, un std::ostringstream.
separator Opțional: textul scris după fiecare valoare.

Ce returnează

Un iterator de ieșire.

Exemple

Exemplul 1: Afișare cu separator și transformare direct la ieșire

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

int main() {
    std::vector<int> v{3, 1, 4, 1, 5};
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';

    std::transform(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, "\n"), [](int x) { return x * x; });
}

Rezultat

3 1 4 1 5 
9
1
16
1
25

Exemplul 2: Construirea unui text CSV

Separatorul apare și după ultimul element, așa că îl scoatem la final.

#include <algorithm>
#include <iterator>
#include <print>
#include <sstream>
#include <string>
#include <vector>

int main() {
    std::vector<std::string> coloane{"nume", "oraș", "vârstă"};
    std::ostringstream linie;
    std::copy(coloane.begin(), coloane.end(), std::ostream_iterator<std::string>(linie, ","));
    std::string csv = linie.str();
    std::println("cu virgula finală: {}", csv);
    csv.pop_back();
    std::println("corectat:          {}", csv);
}

Rezultat

cu virgula finală: nume,oraș,vârstă,
corectat:          nume,oraș,vârstă

Greșeli frecvente

  • Uiți că separatorul este scris și după ultimul element (1, 2, 3, ). Elimină-l, scrie primul element separat sau folosește std::println("{:n}", v).

Comenzi înrudite

  • std::istream_iterator: Iterator care citește valori dintr-un flux de intrare (cin, fișier, stringstream) cu >>, până la final sau la o eroare.
  • std::back_inserter: Iteratori de inserare: fiecare scriere prin back_inserter face push_back, iar prin inserter face insert la o poziție.
  • std::cout: Afișează text și valori în consolă, cu operatorul <<.
  • std::println: Afișează text formatat cu acolade {} și trece pe rândul următor (C++23).