Visión general y filosofía de la STL
Parte de la sección Programación Orientada a Objetos del Journey de C++ de Coddy. Lección 70 de 104.
La Standard Template Library (STL) es una colección de clases y funciones basadas en plantillas que proporcionan estructuras de datos y algoritmos comunes. Basada en los conceptos de plantillas que has aprendido, la STL encarna una poderosa filosofía de diseño: separar el almacenamiento de datos de la manipulación de datos.
La STL está organizada en torno a tres componentes principales que trabajan juntos:
| Componente | Propósito | Ejemplos |
|---|---|---|
| Contenedores | Almacenan colecciones de objetos | vector, map, set |
| Iteradores | Proporcionan acceso a los elementos de los contenedores | Entrada, salida, acceso aleatorio |
| Algoritmos | Realizan operaciones sobre los datos | sort, find, transform |
La idea clave es que los algoritmos no conocen directamente los contenedores: funcionan mediante iteradores. Esto significa que un único algoritmo sort funciona con vectores, matrices y cualquier contenedor que proporcione el tipo de iterador adecuado:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
std::sort(nums.begin(), nums.end());
for (int n : nums) {
std::cout << n << " ";
}
// Salida: 1 2 5 8 9
}Esta separación significa que puedes combinar y ajustar elementos: usar cualquier algoritmo con cualquier contenedor compatible sin escribir código nuevo. La STL proporciona implementaciones optimizadas y probadas en batalla, para que puedas centrarte en resolver problemas en lugar de reinventar estructuras de datos comunes.
Desafío
FácilConstruyamos un sistema sencillo de procesamiento de datos que demuestre la filosofía de STL de separar contenedores, iteradores y algoritmos. Crearás un módulo de utilidades que funcione con componentes de STL y un programa principal que muestre cómo encajan estas piezas.
Crearás dos archivos:
DataProcessor.h: Define funciones de utilidad que funcionen con contenedores de STL mediante iteradores, demostrando la filosofía de diseño de STL.Crea una función llamada
printVectorque reciba unstd::vector<int>&e imprima todos los elementos separados por espacios, seguidos de una nueva línea. Usa iteradores (begin()yend()) para recorrer el contenedor.Crea una función llamada
sortAndPrintque reciba unstd::vector<int>&, lo ordene usandostd::sorty después imprima los elementos ordenados separados por espacios, seguidos de una nueva línea.Crea una función llamada
findElementque reciba unstd::vector<int>&y un valorintque buscar. Usastd::findpara localizar el elemento. Si se encuentra, imprimeFound: <value>. Si no se encuentra, imprimeNot found: <value>.Crea una función llamada
getSumque reciba unstd::vector<int>&y devuelva la suma de todos los elementos. Puedes usar un bucle sencillo con iteradores para esto.main.cpp: Lee los datos de entrada y demuestra cómo funcionan juntos los componentes de STL.Lee cinco valores de entrada, cada uno en una línea separada:
- Primer entero
- Segundo entero
- Tercer entero
- Cuarto entero
- Un valor que buscar
Crea un
std::vector<int>y añade los cuatro primeros enteros. Después, demuestra la filosofía de STL:- Imprimir
Original:y después llamar aprintVector - Imprimir
Sorted:y después llamar asortAndPrint - Llamar a
findElementcon el valor de búsqueda - Imprimir
Sum: <result>usandogetSum
Por ejemplo, con las entradas 5, 2, 8, 1 y 8:
Original: 5 2 8 1
Sorted: 1 2 5 8
Found: 8
Sum: 16Con las entradas 10, 30, 20, 40 y 15:
Original: 10 30 20 40
Sorted: 10 20 30 40
Not found: 15
Sum: 100Observa cómo tus funciones trabajan con el vector mediante iteradores y cómo std::sort y std::find operan sobre cualquier contenedor que proporcione el tipo de iterador adecuado. Este es el poder del diseño de STL: los algoritmos están desacoplados de los contenedores y conectados únicamente mediante iteradores.
Pruébalo tú mismo
#include <iostream>
#include <vector>
#include "DataProcessor.h"
using namespace std;
int main() {
// Lee cinco enteros de la entrada
int num1, num2, num3, num4, searchValue;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> num4;
cin >> searchValue;
// TODO: Crea un vector y añade los primeros cuatro enteros a él
// TODO: Imprime "Original: " y llama a printVector
// TODO: Imprime "Sorted: " y llama a sortAndPrint
// TODO: Llama a findElement con el valor de búsqueda
// TODO: Imprime "Sum: " seguido del resultado de getSum
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éricoPractica por tu cuenta: Compilador de C++ online