Algoritmos de la STL
Parte de la sección Programación Orientada a Objetos del Journey de C++ de Coddy — lección 73 de 104.
Los algoritmos de la STL son funciones de plantilla que operan sobre rangos definidos por iteradores. Se encuentran en las cabeceras <algorithm> y <numeric> y funcionan con cualquier contenedor que proporcione iteradores compatibles.
std::sort ordena los elementos en orden ascendente por defecto:
#include <algorithm>
#include <vector>
std::vector<int> nums = {5, 2, 8, 1};
std::sort(nums.begin(), nums.end());
// nums: {1, 2, 5, 8}std::find busca un valor y devuelve un iterador a la primera coincidencia, o end() si no se encuentra:
auto it = std::find(nums.begin(), nums.end(), 5);
if (it != nums.end()) {
std::cout << "Found at index: " << (it - nums.begin());
}std::transform aplica una operación a cada elemento y almacena los resultados en un rango de destino:
std::vector<int> doubled(nums.size());
std::transform(nums.begin(), nums.end(), doubled.begin(),
[](int x) { return x * 2; });
// doubled: {2, 4, 10, 16}std::accumulate de <numeric> combina todos los elementos en un solo valor:
#include <numeric>
int sum = std::accumulate(nums.begin(), nums.end(), 0);
// sum: 16 (1 + 2 + 5 + 8)Estos algoritmos aceptan rangos de iteradores en lugar de contenedores directamente, lo que los hace lo suficientemente flexibles como para trabajar con rangos parciales o diferentes tipos de contenedores con el mismo código.
Desafío
FácilVamos a construir un analizador de puntajes que procesa una colección de números utilizando algoritmos de la STL. Crearás funciones de utilidad que demuestran cómo sort, find, transform y accumulate trabajan juntos para analizar datos.
Organizarás tu código en dos archivos:
ScoreAnalyzer.h: Define funciones de utilidad que utilizan algoritmos de la STL para procesar vectores de enteros.Crea una función llamada
sortScoresque reciba unstd::vector<int>&y lo ordene de forma ascendente utilizandostd::sort.Crea una función llamada
findScoreque reciba unconst std::vector<int>&y un valor objetivoint. Usastd::findpara buscar el objetivo. Si se encuentra, devuelve el índice (distancia desde el inicio). Si no se encuentra, devuelve-1.Crea una función llamada
applyBonusque reciba unconst std::vector<int>&y una cantidad de bonoint. Usastd::transformpara crear y devolver un nuevo vector donde a cada puntaje se le haya sumado el bono.Crea una función llamada
calculateAverageque reciba unconst std::vector<int>&y devuelva el promedio como undouble. Usastd::accumulatepara calcular la suma y luego divídela por el tamaño.Crea una función llamada
printVectorque reciba unconst std::vector<int>&e imprima todos los elementos separados por espacios, seguidos de un salto de línea.main.cpp: Lee seis entradas (cada una en una línea separada):- Primer puntaje (entero)
- Segundo puntaje (entero)
- Tercer puntaje (entero)
- Cuarto puntaje (entero)
- Un puntaje para buscar (entero)
- Una cantidad de bono a aplicar (entero)
Crea un vector con los cuatro puntajes y demuestra los algoritmos:
- Imprime
Original:seguido del contenido del vector - Ordena los puntajes e imprime
Sorted:seguido del vector ordenado - Busca el puntaje objetivo en el vector ordenado. Si se encuentra, imprime
Found <value> at index <index>. Si no se encuentra, imprime<value> not found - Aplica el bono a los puntajes ordenados e imprime
With bonus:seguido del nuevo vector - Calcula e imprime el promedio de los puntajes ordenados originales (antes del bono) como
Average: <value>con un decimal
Por ejemplo, con las entradas 75, 90, 60, 85, 85 y 5:
Original: 75 90 60 85
Sorted: 60 75 85 90
Found 85 at index 2
With bonus: 65 80 90 95
Average: 77.5Con las entradas 100, 80, 95, 70, 50 y 10:
Original: 100 80 95 70
Sorted: 70 80 95 100
50 not found
With bonus: 80 90 105 110
Average: 86.2Recuerda incluir <algorithm> para sort, find y transform, y <numeric> para accumulate. Usa std::fixed y std::setprecision(1) de <iomanip> para dar formato al promedio.
Hoja de referencia
Los algoritmos de la STL son funciones de plantilla de <algorithm> y <numeric> que operan en rangos definidos por iteradores.
std::sort organiza los elementos en orden ascendente:
#include <algorithm>
#include <vector>
std::vector<int> nums = {5, 2, 8, 1};
std::sort(nums.begin(), nums.end());
// nums: {1, 2, 5, 8}std::find busca un valor y devuelve un iterador a la primera coincidencia, o end() si no se encuentra:
auto it = std::find(nums.begin(), nums.end(), 5);
if (it != nums.end()) {
std::cout << "Found at index: " << (it - nums.begin());
}std::transform aplica una operación a cada elemento y almacena los resultados en un rango de destino:
std::vector<int> doubled(nums.size());
std::transform(nums.begin(), nums.end(), doubled.begin(),
[](int x) { return x * 2; });
// doubled: {2, 4, 10, 16}std::accumulate de <numeric> combina todos los elementos en un solo valor:
#include <numeric>
int sum = std::accumulate(nums.begin(), nums.end(), 0);
// sum: 16 (1 + 2 + 5 + 8)Estos algoritmos funcionan con rangos de iteradores, lo que los hace flexibles para rangos parciales o diferentes tipos de contenedores.
Pruébalo tú mismo
#include <iostream>
#include <vector>
#include <iomanip>
#include "ScoreAnalyzer.h"
using namespace std;
int main() {
// Lee seis entradas
int score1, score2, score3, score4;
int searchTarget, bonusAmount;
cin >> score1;
cin >> score2;
cin >> score3;
cin >> score4;
cin >> searchTarget;
cin >> bonusAmount;
// TODO: Crea un vector con las cuatro puntuaciones
// TODO: Imprime "Original:" seguido del contenido del vector
// TODO: Ordena las puntuaciones e imprime "Sorted:" seguido del vector ordenado
// TODO: Busca la puntuación objetivo en el vector ordenado
// Si se encuentra, imprime "Found <value> at index <index>"
// Si no se encuentra, imprime "<value> not found"
// TODO: Aplica el bono a las puntuaciones ordenadas e imprime "With bonus:" seguido del nuevo vector
// TODO: Calcula e imprime el promedio de las puntuaciones ordenadas (antes del bono)
// Usa fixed y setprecision(1) para el formato
// Imprime como "Average: <value>"
return 0;
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosConstrucción y compilación en C++Archivos de cabecera y archivos fuenteNamespaces y alcanceIntroducción a OOP en C++Clases vs ObjetosEl puntero 'this'Métodos (Funciones miembro)Atributos (Miembros de datos)Conceptos básicos de Ctors y DtorsResumen - Calculadora simple4Propiedades de clase
Miembros de instancia vs. estáticosGetters y SettersFunciones miembro constPalabra clave mutableMétodos y variables estáticosFunciones y clases amigasResumen - Gestor de cuentas bancarias7Herencia
Herencia básicaNiveles de acceso en la herenciaOrden de llamada de Ctor y DtorSobrescritura de métodosFunciones virtuales y VTableHerencia múltipleHerencia virtualResumen - Jerarquía de empleados10Visión general de la STL
Visión general y filosofía de la STLContenedores de la STLIteradoresAlgoritmos de la STLFuntores y expresiones lambdaResumen - Frecuencia de palabras2Gestión de memoria
Memoria Stack vs HeapPunteros y referenciasMemoria dinámica (new/delete)Punteros inteligentes en C++RAII en C++Resumen - Gestor de arrays dinámicos5Encapsulamiento
Especificadores de acceso en C++Especificadores de acceso en profundidadOcultamiento de informaciónStruct vs ClassClases anidadas e internasResumen - Sistema de registros de estudiantes8Polimorfismo
Polimorfismo: Compilación vs. Tiempo de ejecuciónSobrecarga de funcionesFunciones virtuales revisadasFunciones virtuales purasClases abstractasDiseño de interfaces en C++Dynamic Casting y RTTIResumen: Calculadora de figuras11Conceptos avanzados de POO
Composición vs. HerenciaMixins mediante CRTPIdioma PimplBorrado de tiposEnum Classes y tipado fuerteManejo de excepciones en POOJerarquías de excepciones personalizadas14Patrones de diseño - Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositeRAII como patrón3Constructores y Destructores
Constructor por defectoConstructor parametrizadoConstructor de copiaConstructor de movimientoListas de inicialización del constructorConstructores delegadosAnálisis profundo del destructorRegla de tres / cinco / ceroResumen - Clase String6Sobrecarga de operadores
Introducción a la sobrecarga de operadoresSobrecarga de operadores aritméticosSobrecarga de operadores de comparaciónOperadores de flujo (Stream)Sobrecarga del operador de asignaciónSobrecarga de los operadores [] y ()Operadores de conversión de tiposResumen - Clase Matrix9Plantillas
Plantillas de funcionesPlantillas de clasesEspecialización de plantillasPlantillas variádicasConceptos básicos de SFINAE y Type TraitsResumen - Contenedor genérico