CodeNebula
C++98stlbeginner

Input Iterator

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

Explanation

Reads elements in a sequence (single-pass, read-only).

Real-World Scenario

Read data from a file stream in a data parser.

Quick Snippet

snippet.cpp
std::istream_iterator<int> it(std::cin);

Full Example

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

// Input iterators support single-pass reading. std::istream_iterator is the
// classic example - it reads values from an input stream one at a time.

#include <iostream>
#include <sstream>
#include <iterator>
#include <vector>
#include <algorithm> // for std::copy
#include <numeric>   // for std::accumulate

int main() {
    // --- Basic istream_iterator from stringstream ---
    std::cout << "=== Basic istream_iterator ===" << std::endl;
    std::istringstream iss("10 20 30 40 50");

    // Create input iterators
    std::istream_iterator<int> it(iss);   // points to first value
    std::istream_iterator<int> end;       // default = end-of-stream sentinel

    std::cout << "Reading integers from stream:" << std::endl;
    while (it != end) {
        std::cout << "  Read: " << *it << std::endl;
        ++it;
    }

    // --- Reading into a vector ---
    std::cout << "\n=== Reading into a vector ===" << std::endl;
    std::istringstream iss2("5 15 25 35 45 55");
    std::vector<int> vec;

    // Use istream_iterator with std::copy and back_inserter
    std::copy(std::istream_iterator<int>(iss2),
              std::istream_iterator<int>(),
              std::back_inserter(vec));

    std::cout << "Vector contents: ";
    for (std::vector<int>::iterator vit = vec.begin(); vit != vec.end(); ++vit) {
        std::cout << *vit << " ";
    }
    std::cout << std::endl;
    std::cout << "Size: " << vec.size() << std::endl;

    // --- Constructing vector directly from range ---
    std::cout << "\n=== Construct vector from iterator range ===" << std::endl;
    std::istringstream iss3("100 200 300");
    std::vector<int> vec2(std::istream_iterator<int>(iss3),
                          (std::istream_iterator<int>()));
    // Note: extra parentheses around second arg to avoid "most vexing parse"

    std::cout << "Direct-constructed vector: ";
    for (std::vector<int>::iterator vit = vec2.begin(); vit != vec2.end(); ++vit) {
        std::cout << *vit << " ";
    }
    std::cout << std::endl;

    // --- Using with std::accumulate ---
    std::cout << "\n=== accumulate with istream_iterator ===" << std::endl;
    std::istringstream iss4("1 2 3 4 5");
    int sum = std::accumulate(std::istream_iterator<int>(iss4),
                              std::istream_iterator<int>(),
                              0);
    std::cout << "Sum of 1+2+3+4+5 = " << sum << std::endl;

    // --- Reading strings ---
    std::cout << "\n=== Reading strings ===" << std::endl;
    std::istringstream iss5("hello world foo bar");
    std::istream_iterator<std::string> sit(iss5);
    std::istream_iterator<std::string> send;

    std::cout << "Words: ";
    while (sit != send) {
        std::cout << "[" << *sit << "] ";
        ++sit;
    }
    std::cout << std::endl;

    // --- Reading doubles ---
    std::cout << "\n=== Reading doubles ===" << std::endl;
    std::istringstream iss6("1.1 2.2 3.3 4.4");
    std::vector<double> dvec;
    std::copy(std::istream_iterator<double>(iss6),
              std::istream_iterator<double>(),
              std::back_inserter(dvec));

    std::cout << "Doubles: ";
    for (std::vector<double>::iterator dit = dvec.begin(); dit != dvec.end(); ++dit) {
        std::cout << *dit << " ";
    }
    std::cout << std::endl;

    // --- Key properties of input iterators ---
    std::cout << "\n=== Input iterator properties ===" << std::endl;
    std::cout << "1. Single-pass: can only traverse the sequence once" << std::endl;
    std::cout << "2. Read-only: *it returns a value, cannot assign through it" << std::endl;
    std::cout << "3. Supports: ++it, it++, *it, it == end, it != end" << std::endl;
    std::cout << "4. Does NOT support: --it, it + n, it[n]" << std::endl;

    return 0;
}

/*
Expected output:
=== Basic istream_iterator ===
Reading integers from stream:
  Read: 10
  Read: 20
  Read: 30
  Read: 40
  Read: 50

=== Reading into a vector ===
Vector contents: 5 15 25 35 45 55
Size: 6

=== Construct vector from iterator range ===
Direct-constructed vector: 100 200 300

=== accumulate with istream_iterator ===
Sum of 1+2+3+4+5 = 15

=== Reading strings ===
Words: [hello] [world] [foo] [bar]

=== Reading doubles ===
Doubles: 1.1 2.2 3.3 4.4

=== Input iterator properties ===
1. Single-pass: can only traverse the sequence once
2. Read-only: *it returns a value, cannot assign through it
3. Supports: ++it, it++, *it, it == end, it != end
4. Does NOT support: --it, it + n, it[n]
*/
Run command
g++ -std=c++98 -Wall -Wextra -o example input_iterator.cpp