La STL (Standard Template Library) es uno de los pilares más poderosos de C++.
Nos brinda estructuras de datos genéricas, algoritmos reutilizables y utilidades funcionales para escribir código más limpio, rápido y seguro.
Vamos a repasar sus componentes principales y las funciones más usadas.
La STL nos da varios tipos de contenedores, cada uno con su propósito:
- vector: Lista dinámica, similar a un array redimensionable
- std::vector<int> v = {1,2,3};
- list: Lista doblemente enlazada
- std::list<std::string> nombres;
- deque: Doble cola (insertar por ambos extremos)
- std::deque<int> d;
- set: Conjunto ordenado, sin duplicados
- std::set<int> numeros;
- map: Diccionario (clave → valor) ordenado
- std::map<std::string, int> edades;
- unordered_map: Diccionario sin orden, pero más rápido
- std::unordered_map<int, std::string> alumnos;
Los algoritmos de la STL trabajan sobre iteradores, lo que los hace genéricos y potentes.
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> numeros = {3, 1, 4, 1, 5, 9};
// sort: ordena
std::sort(numeros.begin(), numeros.end());
// reverse: invierte
std::reverse(numeros.begin(), numeros.end());
// count: cuenta ocurrencias
int cantidad = std::count(numeros.begin(), numeros.end(), 1);
// find: busca un elemento
auto it = std::find(numeros.begin(), numeros.end(), 5);
if (it != numeros.end())
std::cout << "Encontrado: " << *it << std::endl;
// accumulate: suma o acumula valores
int suma = std::accumulate(numeros.begin(), numeros.end(), 0);
std::cout << "Suma total: " << suma << std::endl;
}
Estos algoritmos no dependen del tipo de contenedor.
Si el contenedor tiene iteradores, funciona igual.
Veamos funciones:
std::copy_if: Copia elementos que cumplan una condición
copy_if(v.begin(), v.end(), back_inserter(res), [](int n){ return n > 3; });
std::transform: Aplica una función a cada elemento
transform(v.begin(), v.end(), v.begin(), [](int n){ return n * 2; });
std::for_each: Itera con una función lambda
for_each(v.begin(), v.end(), [](int n){ cout << n << " "; });
std::remove_if: Elimina (lógicamente) los elementos que cumplan una condición
v.erase(remove_if(v.begin(), v.end(), [](int n){ return n % 2 == 0; }), v.end());
Veamos funciones matematicas comunes:
std::min_element(v.begin(), v.end());
std::max_element(v.begin(), v.end());
std::accumulate(v.begin(), v.end(), 0);
std::inner_product(v.begin(), v.end(), v2.begin(), 0);
Y por ultimo unos trucos:
- Usá auto para no repetir tipos largos.
- Preferí algoritmos STL + lambdas antes que bucles manuales.
- Aprovechá std::optional, std::variant y std::tuple (desde C++17) para código más expresivo.
La STL no es solo una librería: es una forma de pensar en C++.
En lugar de escribir bucles y estructuras manuales, usás herramientas ya optimizadas, seguras y expresivas.