CodeNebula
C++98stlbeginner

Output Iterator

C++98 · The Foundation · Compiler flag: -std=c++98

Explanation

Writes elements to a sequence (single-pass, write-only).

Real-World Scenario

Write results to an output stream in a logging system.

Quick Snippet

snippet.cpp
std::ostream_iterator<int> it(std::cout, " ");

Full Example

output_iterator.cpp
// CodeNebula - C++98 Example: output_iterator
// Compile: g++ -std=c++98 -Wall -Wextra -o example output_iterator.cpp

// Output iterators support single-pass writing. std::ostream_iterator writes
// values to an output stream. Other output iterators include back_inserter,
// front_inserter, and inserter.

#include <iostream>
#include <sstream>
#include <iterator>
#include <vector>
#include <list>
#include <set>
#include <algorithm> // for std::copy, std::transform

int square(int x) { return x * x; }
int negate_val(int x) { return -x; }

int main() {
    // --- ostream_iterator to cout ---
    std::cout << "=== ostream_iterator to cout ===" << std::endl;
    std::ostream_iterator<int> cout_it(std::cout, " ");

    // Write individual values
    *cout_it = 10; ++cout_it;
    *cout_it = 20; ++cout_it;
    *cout_it = 30; ++cout_it;
    std::cout << std::endl;

    // --- Copy vector to cout ---
    std::cout << "\n=== Copy vector to cout ===" << std::endl;
    int arr[] = {1, 2, 3, 4, 5};
    std::vector<int> vec(arr, arr + 5);

    std::cout << "With space delimiter: ";
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;

    std::cout << "With comma delimiter: ";
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, ", "));
    std::cout << std::endl;

    std::cout << "With newline delimiter:" << std::endl;
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, "\n"));

    // --- ostream_iterator to stringstream ---
    std::cout << "\n=== ostream_iterator to stringstream ===" << std::endl;
    std::ostringstream oss;
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(oss, "-"));
    std::cout << "Stringstream result: " << oss.str() << std::endl;

    // --- ostream_iterator with strings ---
    std::cout << "\n=== ostream_iterator with strings ===" << std::endl;
    std::vector<std::string> words;
    words.push_back("hello");
    words.push_back("world");
    words.push_back("foo");
    words.push_back("bar");

    std::cout << "Words: ";
    std::copy(words.begin(), words.end(),
              std::ostream_iterator<std::string>(std::cout, " | "));
    std::cout << std::endl;

    // --- back_inserter ---
    std::cout << "\n=== back_inserter ===" << std::endl;
    std::vector<int> src;
    src.push_back(10);
    src.push_back(20);
    src.push_back(30);

    std::vector<int> dest;
    std::copy(src.begin(), src.end(), std::back_inserter(dest));

    std::cout << "Copied via back_inserter: ";
    std::copy(dest.begin(), dest.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;

    // --- front_inserter ---
    std::cout << "\n=== front_inserter ===" << std::endl;
    std::list<int> front_dest;
    std::copy(src.begin(), src.end(), std::front_inserter(front_dest));

    std::cout << "Copied via front_inserter (reversed): ";
    std::copy(front_dest.begin(), front_dest.end(),
              std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;

    // --- inserter ---
    std::cout << "\n=== inserter ===" << std::endl;
    std::set<int> my_set;
    int data[] = {5, 3, 8, 1, 9, 2, 7};
    std::copy(data, data + 7, std::inserter(my_set, my_set.begin()));

    std::cout << "Set via inserter (sorted): ";
    std::copy(my_set.begin(), my_set.end(),
              std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;

    // --- transform with output iterator ---
    std::cout << "\n=== transform with ostream_iterator ===" << std::endl;
    std::cout << "Squares: ";
    std::transform(vec.begin(), vec.end(),
                   std::ostream_iterator<int>(std::cout, " "),
                   square);
    std::cout << std::endl;

    std::cout << "Negated: ";
    std::transform(vec.begin(), vec.end(),
                   std::ostream_iterator<int>(std::cout, " "),
                   negate_val);
    std::cout << std::endl;

    // --- transform into a new container ---
    std::cout << "\n=== transform with back_inserter ===" << std::endl;
    std::vector<int> squared;
    std::transform(vec.begin(), vec.end(), std::back_inserter(squared), square);

    std::cout << "Squared vector: ";
    std::copy(squared.begin(), squared.end(),
              std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;

    // --- Key properties of output iterators ---
    std::cout << "\n=== Output iterator properties ===" << std::endl;
    std::cout << "1. Single-pass: can only traverse the sequence once" << std::endl;
    std::cout << "2. Write-only: *it = value assigns, cannot read through it" << std::endl;
    std::cout << "3. Supports: ++it, it++, *it = val" << std::endl;
    std::cout << "4. Does NOT support: *it (read), it == end, --it, it + n" << std::endl;

    return 0;
}

/*
Expected output:
=== ostream_iterator to cout ===
10 20 30

=== Copy vector to cout ===
With space delimiter: 1 2 3 4 5
With comma delimiter: 1, 2, 3, 4, 5,
With newline delimiter:
1
2
3
4
5

=== ostream_iterator to stringstream ===
Stringstream result: 1-2-3-4-5-

=== ostream_iterator with strings ===
Words: hello | world | foo | bar |

=== back_inserter ===
Copied via back_inserter: 10 20 30

=== front_inserter ===
Copied via front_inserter (reversed): 30 20 10

=== inserter ===
Set via inserter (sorted): 1 2 3 5 7 8 9

=== transform with ostream_iterator ===
Squares: 1 4 9 16 25
Negated: -1 -2 -3 -4 -5

=== transform with back_inserter ===
Squared vector: 1 4 9 16 25

=== Output iterator properties ===
1. Single-pass: can only traverse the sequence once
2. Write-only: *it = value assigns, cannot read through it
3. Supports: ++it, it++, *it = val
4. Does NOT support: *it (read), it == end, --it, it + n
*/
Run command
g++ -std=c++98 -Wall -Wextra -o example output_iterator.cpp