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 del contenedor | Entrada, salida, acceso aleatorio |
| Algoritmos | Realizan operaciones sobre los datos | sort, find, transform |
La idea clave es que los algoritmos no conocen los contenedores directamente; funcionan a través de iteradores. Esto significa que un único algoritmo sort funciona con vectores, arreglos 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 mezclar y combinar: utiliza cualquier algoritmo con cualquier contenedor compatible sin escribir código nuevo. La STL proporciona implementaciones optimizadas y de eficacia probada para que puedas concentrarte en resolver problemas en lugar de reinventar estructuras de datos comunes.
Desafío
FácilConstruyamos un sistema de procesamiento de datos simple que demuestre la filosofía de la STL de separar contenedores, iteradores y algoritmos. Crearás un módulo de utilidad que trabaje con componentes de la STL y un programa principal que muestre cómo encajan estas piezas.
Crearás dos archivos:
DataProcessor.h: Define funciones de utilidad que trabajen con contenedores de la STL a través de iteradores, demostrando la filosofía de diseño de la STL.Crea una función llamada
printVectorque reciba unstd::vector<int>&e imprima todos los elementos separados por espacios, seguidos de un salto de línea. Usa iteradores (begin()yend()) para recorrer el contenedor.Crea una función llamada
sortAndPrintque reciba unstd::vector<int>&, lo ordene usandostd::sort, y luego imprima los elementos ordenados separados por espacios seguidos de un salto de línea.Crea una función llamada
findElementque reciba unstd::vector<int>&y un valorintpara 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 simple con iteradores para esto.main.cpp: Lee las entradas y demuestra cómo los componentes de la STL trabajan juntos.Lee cinco entradas (cada una en una línea separada):
- Primer entero
- Segundo entero
- Tercer entero
- Cuarto entero
- Un valor para buscar
Crea un
std::vector<int>y añade los primeros cuatro enteros a él. Luego demuestra la filosofía de la STL mediante:- Imprimir
Original:seguido de la llamada aprintVector - Imprimir
Sorted:seguido de la llamada 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 a través de iteradores, y cómo std::sort y std::find operan en cualquier contenedor que proporcione el tipo de iterador adecuado. Este es el poder del diseño de la STL: los algoritmos están desacoplados de los contenedores, conectados únicamente a través de iteradores.
Hoja de referencia
La Biblioteca de Plantillas Estándar (STL) es una colección de clases y funciones basadas en plantillas que proporcionan estructuras de datos y algoritmos comunes. Separa el almacenamiento de datos de la manipulación de datos.
La STL tiene tres componentes principales:
| Componente | Propósito | Ejemplos |
|---|---|---|
| Contenedores | Almacenan colecciones de objetos | vector, map, set |
| Iteradores | Proporcionan acceso a los elementos del contenedor | Entrada, salida, acceso aleatorio |
| Algoritmos | Realizan operaciones sobre los datos | sort, find, transform |
Los algoritmos funcionan a través de iteradores, no directamente con los contenedores. Esto permite que un solo algoritmo funcione con cualquier contenedor compatible:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
// Ordenar usando iteradores
std::sort(nums.begin(), nums.end());
// Recorrer usando iteradores
for (int n : nums) {
std::cout << n << " ";
}
// Salida: 1 2 5 8 9
}Métodos comunes de iteradores:
begin()- devuelve un iterador al primer elementoend()- devuelve un iterador a la posición después del último elemento
Algoritmos comunes de la STL:
std::sort(begin, end)- ordena los elementos en un rangostd::find(begin, end, value)- busca un valor en un rango
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 por el 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érico