Biblioteca frozen para C++: Guía completa de contenedores compile-time
La biblioteca frozen es una biblioteca header-only para C++17 y versiones posteriores que proporciona contenedores (map, set, string) completamente inicializados en tiempo de compilación (compile-time). Permite crear estructuras de datos inmutables (immutable) que no requieren asignación dinámica de memoria durante la ejecución. Es la solución ideal para sistemas embebidos, motores de juegos, servidores de alta carga y cualquier código donde el rendimiento y la previsibilidad sean críticos.
La idea principal de frozen es que defines el contenedor como constexpr o constinit, y todo el trabajo de ordenamiento, hashing y construcción de la estructura de datos ocurre durante la compilación. En tiempo de ejecución, obtienes un contenedor listo y optimizado que funciona con una sobrecarga mínima. Por ejemplo, frozen::map utiliza búsqueda binaria sobre un array ordenado, mientras que frozen::unordered_map emplea hashing perfecto (perfect hashing), garantizando acceso O(1) sin colisiones.
Para los desarrolladores de C++, esto significa: sin memoria dinámica (sin new/delete), sin excepciones (noexcept), total seguridad en concurrencia (thread-safety) ya que los datos son de solo lectura, y la posibilidad de colocar contenedores en la memoria flash de microcontroladores. La biblioteca se utiliza activamente en proyectos de Facebook (ahora Meta), en compiladores y en núcleos de sistemas operativos.
Instalación
La biblioteca frozen es header-only, por lo que la instalación se reduce a copiar los archivos de cabecera en tu proyecto. La forma más sencilla es usar Conan o CMake FetchContent. A continuación se muestran los comandos exactos para varios gestores de paquetes.
Instalación mediante Conan (recomendada)
conan install frozen/1.1.1@ -r conancenter
# Luego agrega en CMakeLists.txt:
# find_package(frozen REQUIRED)
# target_link_libraries(tu_proyecto frozen::frozen)
Instalación mediante vcpkg
vcpkg install frozen
# Después de la instalación, usa:
# find_package(frozen CONFIG REQUIRED)
# target_link_libraries(tu_proyecto frozen::frozen)
Instalación mediante CMake FetchContent (sin gestor de paquetes)
include(FetchContent)
FetchContent_Declare(
frozen
GIT_REPOSITORY https://github.com/serge-sans-paille/frozen.git
GIT_TAG v1.1.1
)
FetchContent_MakeAvailable(frozen)
target_link_libraries(tu_proyecto frozen::frozen)
Instalación manual (header-only)
git clone https://github.com/serge-sans-paille/frozen.git
# Copia la carpeta frozen/include/frozen en tu proyecto
# Agrega la ruta de include al compilador:
# g++ -I/ruta/a/frozen/include tu_archivo.cpp -std=c++17
Inicio rápido: ejemplo mínimo funcional
Crea un archivo ejemplo.cpp con el siguiente contenido:
#include <iostream>
#include <frozen/unordered_map.h>
#include <frozen/string.h>
int main() {
// Creamos un map en tiempo de compilación con hashing perfecto
constexpr frozen::unordered_map<frozen::string, int, 3> calorias_fruta = {
{"manzana", 95},
{"platano", 105},
{"naranja", 62}
};
// Búsqueda en tiempo de ejecución — O(1), sin colisiones
std::cout << "Calorías del plátano: " << calorias_fruta.at("platano") << "\n";
// Verificar si una clave existe
if (auto it = calorias_fruta.find("uva"); it != calorias_fruta.end()) {
std::cout << "Uva encontrada: " << it->second << "\n";
} else {
std::cout << "Uva no encontrada\n";
}
// Iterar sobre todos los elementos
for (auto& [fruta, calorias] : calorias_fruta) {
std::cout << fruta.data() << También en la biblioteca
Trabajo con CSV en Java: bibliotecas OpenCSV, Apache Commons CSV y Java Scanner
Colas de tareas en Swift: GCD, OperationQueue y Swift Concurrency
Cliente Redis para C# (.NET): StackExchange.Redis — conexión y ejemplos