💻 Exemplos: Capítulo 04: Estruturas Repetitivas, Range-Based For e C++20 Ranges
💻 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