Biblioteca estándar de C++ (STL): revisión completa
La biblioteca estándar de C++ (a menudo llamada STL — Standard Template Library) es un potente conjunto de clases y funciones plantilla que es una parte integral de cualquier compilador de C++. Proporciona al desarrollador soluciones listas, probadas y altamente eficientes para la mayoría de las tareas cotidianas: desde trabajar con colecciones de datos hasta algoritmos complejos y entrada/salida. El estudio de la STL es un paso clave en el dominio del C++ moderno.
En este artículo, analizaremos en detalle los componentes principales de la biblioteca estándar, su propósito y proporcionaremos ejemplos prácticos de uso.
1. Contenedores (Containers)
Los contenedores son estructuras de datos diseñadas para almacenar colecciones de objetos. Todos los contenedores son clases plantilla, lo que permite almacenar elementos de cualquier tipo.
- Contenedores secuenciales: almacenan elementos en orden lineal.
std::vector— arreglo dinámico. Acceso rápido por índice, inserción/eliminación al final — O(1), en medio — O(n).std::list— lista doblemente enlazada. Inserción/eliminación rápida en cualquier lugar, pero sin acceso directo por índice.std::deque— cola doble. Inserción/eliminación rápida tanto al principio como al final.std::array— arreglo estático de tamaño fijo (C++11).
- Contenedores asociativos: almacenan elementos en orden ordenado (generalmente basados en árboles rojo-negro).
std::set— conjunto de elementos únicos.std::map— diccionario (arreglo asociativo) de pares "clave-valor".std::multiset/std::multimap— análogos que permiten duplicados.
- Contenedores asociativos no ordenados (C++11): utilizan tablas hash.
std::unordered_set,std::unordered_map— acceso rápido en promedio O(1).
- Adaptadores de contenedores: proporcionan una interfaz limitada basada en otro contenedor.
std::stack(LIFO),std::queue(FIFO),std::priority_queue(con prioridad).
Ejemplo de uso de std::vector:
#include <iostream>#include <vector>
int main() { std::vector<int> numbers = {10, 20, 30, 40, 50}; numbers.push_back(60); // Agregamos un elemento al final for (int n : numbers) { std::cout << n << " "; } // Salida: 10 20 30 40 50 60 return 0;}2. Iteradores (Iterators)
Los iteradores son punteros generalizados que permiten recorrer los elementos de cualquier contenedor de manera uniforme. Son el vínculo entre los contenedores y los algoritmos.
- Categorías de iteradores: Input, Output, Forward, Bidirectional, Random Access.
begin()/end()— devuelven iteradores al primer elemento y al último+1.std::advance()— mueve el iterador N posiciones.std::distance()— calcula la distancia entre dos iteradores.
Ejemplo con iteradores:
#include <iostream>#include <vector>
int main() { std::vector<std::string> words = {"Hello", "World", "C++"}; for (auto it = words.begin(); it != words.end(); ++it) { std::cout << *it << " "; } // Salida: Hello World C++ return 0;}