C++
¿Qué es la Standard Library?
El panorama completo de lo que trae la Standard Library de C++, parte por parte, y en qué se diferencia de la STL.
De dónde venimos
En La Standard Library y tu primer main() ya quedaron resueltas tres cosas que aquí se dan por sabidas:
- Qué hace un
#include: no instala nada, solo le dice al compilador qué parte de la librería quieres activar en este archivo. - Qué significa el prefijo
std::y por qué todo lo estándar vive dentro de ese namespace. - Cómo se usa la parte de entrada y salida por consola con
std::coutystd::cin.
Lo que esa página no contó es cuánto más hay. <iostream> es una puerta de entrada diminuta comparada con el resto: hay contenedores para guardar colecciones de datos, algoritmos genéricos para ordenarlas y buscarlas, utilidades para medir tiempo, y bastante más. Esta página es el mapa de todo eso, para que sepas qué existe antes de necesitarlo.
No tienes que memorizar esta página. Su función es que, cuando te encuentres con un problema del tipo “necesito una lista que crezca” o “necesito ordenar esto”, sepas que la respuesta probablemente ya viene incluida con tu compilador y no tengas que escribirla a mano ni buscar una librería externa.
Un mapa de la Standard Library
| Parte | Headers típicos | Para qué sirve |
|---|---|---|
| Entrada y salida | <iostream>, <fstream> | Leer y escribir por consola o en archivos |
| Texto | <string> | Cadenas de texto que gestionan su propia memoria |
| Contenedores | <vector>, <array>, <map>, <set> | Guardar colecciones de datos |
| Algoritmos | <algorithm>, <numeric> | Ordenar, buscar, contar, sumar sobre esos contenedores |
| Utilidades varias | <utility>, <chrono>, <random> | Piezas sueltas: pares de valores, tiempo, números aleatorios |
Cada fila se explica un poco más abajo. Fíjate en el patrón: un header por área temática, y solo pagas (en tiempo de compilación) por los que incluyes.
Entrada y salida
<iostream> es el que ya conoces: std::cout para escribir en la consola y std::cin para leer lo que el usuario tipea. Su hermano <fstream> hace lo mismo pero contra archivos del disco, con los mismos operadores << y >>, así que cuando lo necesites la sintaxis ya te resultará familiar.
Texto
<string> trae std::string, la clase de texto de C++. Ya apareció en la comparación con las cadenas de estilo C: a diferencia de un char[], un std::string guarda su propia longitud, crece cuando le concatenas más texto y libera su memoria solo.
Contenedores
Un contenedor es un objeto cuyo trabajo es guardar otros objetos. Es la parte de la Standard Library que más vas a usar en el día a día, y la razón por la que existe este grupo de páginas:
std::vector— una lista que crece y se encoge sola. El caballo de batalla, el que usarás en el 90% de los casos.std::array— tamaño fijo decidido al compilar, pero con los métodos y la seguridad de la Standard Library.std::map— asocia claves con valores (por ejemplo, un nombre con un teléfono), como un diccionario.std::set— guarda valores únicos y sin repetir.
Las dos páginas siguientes cubren std::vector y std::array en detalle, que son los dos que reemplazan directamente a los arrays de estilo C.
Algoritmos
<algorithm> trae funciones genéricas —ordenar, buscar, contar, invertir, eliminar— que funcionan sobre casi cualquier contenedor sin que tengas que reescribirlas para cada uno. La idea de fondo es que std::sort sirve igual para un std::vector de números que para uno de textos.
No lo vamos a profundizar en este grupo de páginas: primero conviene tener claros los contenedores sobre los que operan estos algoritmos. Basta con que sepas que existen y que rara vez tiene sentido escribir tu propio ordenamiento a mano en C++.
Utilidades varias
Piezas sueltas que no encajan en las categorías anteriores. Las dos que más te vas a cruzar leyendo código ajeno:
<utility>— contienestd::pair, una pareja de dos valores que pueden ser de tipos distintos, útil cuando una función necesita devolver dos cosas a la vez.<chrono>— medición de tiempo: cuánto tardó un fragmento de código, esperas de una cantidad de milisegundos, etc.
Tampoco las vamos a desarrollar aquí; están en el mapa para que reconozcas el nombre cuando aparezca.
Todo esto se activa igual: con un include
La mecánica no cambia de una parte a otra. Cada #include habilita un área, y a partir de ahí los nombres se usan con el prefijo std:::
#include <iostream> // entrada/salida por consola
#include <string> // std::string
#include <vector> // std::vector
int main() {
std::string titulo = "Lenguajes que estoy aprendiendo";
std::vector<std::string> lenguajes = {"C++", "Python", "Java"};
std::cout << titulo << " (" << lenguajes.size() << "):\n";
for (const std::string& nombre : lenguajes) {
std::cout << "- " << nombre << "\n";
}
return 0;
}g++ -std=c++17 -Wall -o mapa mapa.cpp
./mapaLenguajes que estoy aprendiendo (3):
- C++
- Python
- JavaSi la línea del std::vector todavía te resulta opaca, es esperable: es el tema completo de la próxima página. Aquí solo interesa el patrón general — tres includes, tres áreas de la librería, y todo accesible con std::. El for es el bucle basado en rango que ya viste con arrays, y el const std::string& es una referencia para no copiar cada texto en cada vuelta.
STL y Standard Library: por qué se confunden
Vas a leer las dos expresiones usadas como si fueran sinónimos, y conviene saber de dónde viene la diferencia para no marearte.
- Standard Library es todo lo que el estándar de C++ obliga a incluir con el compilador:
<iostream>,<string>,<fstream>, contenedores, algoritmos, utilidades… el mapa completo de arriba. - STL son las siglas de Standard Template Library, una librería que Alexander Stepanov diseñó a principios de los 90 y que se incorporó al estándar en 1998. Su aporte concreto fue la tríada contenedores + iteradores + algoritmos: la idea de que los algoritmos genéricos y los contenedores se pudieran combinar libremente entre sí.
Es decir: técnicamente, la STL es una parte de la Standard Library, no toda. Pero en el uso cotidiano —foros, tutoriales, conversaciones de pasillo— muchísima gente dice “la STL” para referirse a la librería estándar entera.
En la práctica no vale la pena corregir a nadie por esto. Si alguien dice “usa un contenedor de la STL”, está siendo preciso; si dice “std::cout es parte de la STL”, está siendo informal pero se entiende igual. Lo único importante es que sepas que ambas expresiones apuntan al mismo cuerpo de código que ya viene instalado con tu compilador.
Por qué usarla en vez de escribir lo tuyo
Tres razones, en orden de importancia práctica:
- Ya está probada. Es código que usan millones de programas desde hace décadas. Tu versión casera de una lista dinámica tendrá bugs que la de la librería ya no tiene.
- Gestiona la memoria por ti. Los contenedores piden y liberan memoria solos, que es justo la parte donde C++ es más fácil de romper (lo verás con detalle en la próxima página).
- Se lee sola. Cualquier programador de C++ entiende
std::vector<int>de un vistazo, sin tener que leer tu implementación.
La Standard Library no cubre todo: no trae interfaces gráficas, ni red, ni acceso a bases de datos, ni gráficos 3D. Para eso están las librerías externas, como Dear ImGui más adelante en esta documentación. La regla mental es: si el problema es genérico y no depende del sistema operativo, revisa primero si la Standard Library ya lo resuelve.
Siguiente paso
El contenedor por el que hay que empezar es el que resuelve la limitación más molesta de los arrays de estilo C —su tamaño fijo—: continúa con std::vector.