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ștestd::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).