Ejemplos prácticos de rangos
Escenarios de iteración de rangos en el mundo real
La iteración basada en rangos proporciona soluciones poderosas en diversos dominios de programación. Esta sección explora aplicaciones prácticas que demuestran la versatilidad de las técnicas basadas en rangos.
Ejemplos de procesamiento de datos
Filtrado de colecciones numéricas
#include <vector>
#include <iostream>
#include <algorithm>
std::vector<int> filterEvenNumbers(const std::vector<int>& input) {
std::vector<int> result;
for (const int& num : input) {
if (num % 2 == 0) {
result.push_back(num);
}
}
return result;
}
#include <vector>
#include <algorithm>
std::vector<int> squareNumbers(const std::vector<int>& input) {
std::vector<int> result;
for (const int& num : input) {
result.push_back(num * num);
}
return result;
}
Patrones de iteración
Patrón |
Descripción |
Caso de uso |
Secuencial |
Recorrido lineal |
Colecciones simples |
Filtrado |
Iteración condicional |
Detección de datos |
Transformado |
Modificación de elementos |
Preprocesamiento de datos |
Agregado |
Operaciones acumulativas |
Cálculos estadísticos |
Técnicas de iteración avanzadas
Iteración de rangos anidados
std::vector<std::vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (const auto& row : matrix) {
for (const auto& element : row) {
std::cout << element << " ";
}
std::cout << std::endl;
}
Generación de rangos personalizados
class NumberRange {
private:
int start, end;
public:
NumberRange(int s, int e) : start(s), end(e) {}
class Iterator {
private:
int current;
public:
Iterator(int val) : current(val) {}
int operator*() { return current; }
Iterator& operator++() {
++current;
return *this;
}
bool operator!=(const Iterator& other) {
return current != other.current;
}
};
Iterator begin() { return Iterator(start); }
Iterator end() { return Iterator(end); }
};
Visualización del flujo de iteración
graph TD
A[Start Range] --> B{Iterate Elements}
B -->|Process| C[Transform/Filter]
C --> D{More Elements?}
D -->|Yes| B
D -->|No| E[End Range]
Consideraciones de rendimiento
- Prefiera referencias constantes para objetos grandes
- Utilice semántica de movimiento cuando sea apropiado
- Minimice las copias innecesarias
Estrategias de manejo de errores
- Valide los rangos de entrada
- Maneje colecciones vacías
- Implemente comprobaciones de límites sólidas
Consejo de LabEx Pro
Experimente con diferentes técnicas de iteración para descubrir el enfoque más eficiente para su caso de uso específico.
Ejemplo de iteración compleja
#include <vector>
#include <numeric>
double calculateWeightedAverage(
const std::vector<double>& values,
const std::vector<double>& weights
) {
double total = 0.0;
double weightSum = 0.0;
for (size_t i = 0; i < values.size(); ++i) {
total += values[i] * weights[i];
weightSum += weights[i];
}
return total / weightSum;
}
Extensiones de rangos de C++ moderno
- std::ranges (C++20)
- Algoritmos de la biblioteca de rangos
- Adaptadores de rangos componibles
Mejores prácticas
- Elija el método de iteración adecuado
- Priorice la legibilidad
- Optimice para el rendimiento
- Utilice algoritmos de la biblioteca estándar