💻 Exemplos: Capítulo 04: Estruturas Repetitivas, Range-Based For e C++20 Ranges

Especialização em Sistemas com C++ • Demonstrações Práticas Compiláveis


🎯 Objetivo dos Exemplos

Demonstrar a evolução da iteração em C++: do tradicional laço indexado aos laços baseados em intervalo (range-based for) com passagem segura por referência imutável (const auto&), e o uso avançado da biblioteca C++20 Ranges (<ranges>) para composição funcional preguiçosa (lazy evaluation) via operador de pipe |.


1. Código Fonte Completo (main.cpp)

/**
 * @file main.cpp
 * @brief Laços iterativos modernos, range-based for e C++20 std::views.
 */

#include <iostream>
#include <vector>
#include <ranges>
#include <numeric>

struct AmostraSinal {
    int id;
    double voltagem;
    bool valido;
};

int main() {
    std::cout << "=== CAPÍTULO 04: LAÇOS MODERNOS E C++20 RANGES ===" << '\n';

    // 1. Coleção de Amostras de Alta Taxa
    std::vector<AmostraSinal> telemetria = {
        {1, 3.28, true},
        {2, 0.05, false}, // Amostra com ruído / inválida
        {3, 4.95, true},
        {4, 1.12, true},
        {5, 5.01, true},
        {6, 0.00, false}
    };

    // 2. Range-Based For Idiomático por Referência Constante (Zero Cópia)
    std::cout << "\n--- 1. Iteracao Direta por Referencia Constante ---" << '\n';
    for (const auto& amostra : telemetria) {
        if (!amostra.valido) continue;
        std::cout << "Sensor [" << amostra.id << "] -> " << amostra.voltagem << " V" << '\n';
    }

    // 3. C++20 Ranges & Views: Pipeline Declarativo e Preguiçoso (Lazy)
    std::cout << "\n--- 2. Pipeline com C++20 std::views ---" << '\n';
    
    // Filtra amostras válidas, transforma extraindo apenas a voltagem e pega os 2 primeiros
    auto pipeline_sensores = telemetria 
        | std::views::filter([](const AmostraSinal& s) { return s.valido; })
        | std::views::transform([](const AmostraSinal& s) { return s.voltagem; })
        | std::views::take(2);

    for (double v : pipeline_sensores) {
        std::cout << "Amostra selecionada no pipeline: " << v << " V" << '\n';
    }

    // 4. Gerador Infinito de Sequência com std::views::iota e take
    std::cout << "\n--- 3. Sequencia Infinita com std::views::iota ---" << '\n';
    for (int ciclo : std::views::iota(100) | std::views::take(5)) {
        std::cout << "Ciclo de Clock Hardware: 0x" << std::hex << ciclo << std::dec << '\n';
    }

    return 0;
}

2. Instruções de Compilação e Execução

# Compilação com GCC / Clang
g++ -std=c++20 -Wall -Wextra -O2 main.cpp -o app_ranges
./app_ranges

# Compilação com MSVC
cl /std:c++20 /EHsc /W4 /O2 main.cpp /Fe:app_ranges.exe
.\app_ranges.exe

3. Saída Esperada no Terminal

=== CAPÍTULO 04: LAÇOS MODERNOS E C++20 RANGES ===

--- 1. Iteracao Direta por Referencia Constante ---
Sensor [1] -> 3.28 V
Sensor [3] -> 4.95 V
Sensor [4] -> 1.12 V
Sensor [5] -> 5.01 V

--- 2. Pipeline com C++20 std::views ---
Amostra selecionada no pipeline: 3.28 V
Amostra selecionada no pipeline: 4.95 V

--- 3. Sequencia Infinita com std::views::iota ---
Ciclo de Clock Hardware: 0x64
Ciclo de Clock Hardware: 0x65
Ciclo de Clock Hardware: 0x66
Ciclo de Clock Hardware: 0x67
Ciclo de Clock Hardware: 0x68