frozen pour C++ : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Bibliothèque frozen pour C++ : Guide complet des conteneurs compile-time

La bibliothèque frozen est une bibliothèque header-only pour C++17 et versions ultérieures, fournissant des conteneurs (map, set, string) entièrement initialisés à la compilation (compile-time). Elle permet de créer des structures de données immuables (immutable) qui ne nécessitent aucune allocation dynamique de mémoire à l'exécution. C'est la solution idéale pour les systèmes embarqués, les moteurs de jeux, les serveurs à forte charge et tout code où la performance et la prévisibilité du temps d'exécution sont critiques.

L'idée principale de frozen est que vous définissez un conteneur comme constexpr ou constinit, et tout le travail de tri, de hachage et de construction de la structure de données se produit à la compilation. À l'exécution, vous obtenez un conteneur prêt et optimisé qui fonctionne avec une surcharge minimale. Par exemple, frozen::map utilise une recherche binaire sur un tableau trié, tandis que frozen::unordered_map utilise le hachage parfait (perfect hashing), garantissant un accès en O(1) sans collisions.

Pour les développeurs C++, cela signifie : pas de mémoire dynamique (pas de new/delete), pas d'exceptions (noexcept), une sécurité totale pour les threads (car les données sont en lecture seule) et la possibilité de placer les conteneurs dans la mémoire flash des microcontrôleurs. La bibliothèque est activement utilisée dans les projets de Facebook (aujourd'hui Meta), dans les compilateurs et dans les noyaux de systèmes d'exploitation.

Installation

La bibliothèque frozen est header-only, donc l'installation se résume à copier les fichiers d'en-tête dans votre projet. Le moyen le plus simple est d'utiliser Conan ou CMake FetchContent. Voici les commandes exactes pour différents gestionnaires de paquets.

Installation via Conan (recommandée)

conan install frozen/1.1.1@ -r conancenter
# Ajoutez ensuite dans CMakeLists.txt :
# find_package(frozen REQUIRED)
# target_link_libraries(your_target frozen::frozen)

Installation via vcpkg

vcpkg install frozen
# Après installation, utilisez :
# find_package(frozen CONFIG REQUIRED)
# target_link_libraries(your_target frozen::frozen)

Installation via CMake FetchContent (sans gestionnaire de paquets)

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(your_target frozen::frozen)

Installation manuelle (header-only)

git clone https://github.com/serge-sans-paille/frozen.git
# Copiez le dossier frozen/include/frozen dans votre projet
# Ajoutez le chemin d'inclusion au compilateur :
# g++ -I/chemin/vers/frozen/include votre_fichier.cpp -std=c++17

Démarrage rapide : exemple minimal fonctionnel

Créez un fichier exemple.cpp avec le contenu suivant :

#include <iostream>
#include <frozen/unordered_map.h>
#include <frozen/string.h>

int main() {
    // Création d'une map compile-time avec hachage parfait
    constexpr frozen::unordered_map<frozen::string, int, 3> calories_fruits = {
        {"pomme", 95},
        {"banane", 105},
        {"orange", 62}
    };

    // Recherche à l'exécution — O(1), sans collisions
    std::cout << "Calories de la banane : " << calories_fruits.at("banane") << "\n";

    // Vérification de la présence d'une clé
    if (auto it = calories_fruits.find("raisin"); it != calories_fruits.end()) {
        std::cout << "Raisin trouvé : " << it->second << "\n";
    } else {
        std::cout << "Raisin non trouvé\n";
    }

    // Itération sur tous les éléments
    for (auto& [fruit, calories] : calories_fruits) {
        std::cout << fruit.data() <<                    

Recommendations