frozen für C++: Komplettguide mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Die frozen-Bibliothek für C++: Vollständiger Leitfaden zu Compile-Time-Containern

Die frozen-Bibliothek ist eine Header-Only-Bibliothek für C++17 und neuer, die Container (map, set, string) bereitstellt, die vollständig zur Compile-Zeit initialisiert werden. Sie ermöglicht die Erstellung unveränderlicher (immutable) Datenstrukturen, die keine dynamische Speicherzuweisung zur Laufzeit benötigen. Dies ist die ideale Lösung für eingebettete Systeme, Spiele-Engines, stark ausgelastete Server und jeden Code, bei dem Leistung und Vorhersagbarkeit der Laufzeit entscheidend sind.

Der Grundgedanke von frozen ist, dass Sie einen Container als constexpr oder constinit definieren und die gesamte Arbeit des Sortierens, Hashings und Aufbaus der Datenstruktur während der Compile-Zeit erfolgt. Zur Laufzeit erhalten Sie einen fertigen, optimierten Container, der mit minimalem Overhead arbeitet. Beispielsweise verwendet frozen::map eine binäre Suche in einem sortierten Array, während frozen::unordered_map perfektes Hashing (perfect hashing) nutzt, was einen O(1)-Zugriff ohne Kollisionen garantiert.

Für C++-Entwickler bedeutet dies: keine dynamische Speicherverwaltung (kein new/delete), keine Ausnahmen (noexcept), vollständige Thread-Sicherheit (da die Daten nur lesbar sind) und die Möglichkeit, Container im Flash-Speicher von Mikrocontrollern zu platzieren. Die Bibliothek wird aktiv in Projekten von Facebook (heute Meta), in Compilern und in Betriebssystemkernen eingesetzt.

Installation

Die frozen-Bibliothek ist Header-Only, daher beschränkt sich die Installation auf das Kopieren der Header-Dateien in Ihr Projekt. Der einfachste Weg ist die Verwendung von Conan oder CMake FetchContent. Nachfolgend finden Sie die genauen Befehle für verschiedene Paketmanager.

Installation mit Conan (empfohlen)

conan install frozen/1.1.1@ -r conancenter
# Fügen Sie dann in CMakeLists.txt hinzu:
# find_package(frozen REQUIRED)
# target_link_libraries(your_target frozen::frozen)

Installation mit vcpkg

vcpkg install frozen
# Nach der Installation verwenden Sie:
# find_package(frozen CONFIG REQUIRED)
# target_link_libraries(your_target frozen::frozen)

Installation mit CMake FetchContent (ohne Paketmanager)

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)

Manuelle Installation (Header-Only)

git clone https://github.com/serge-sans-paille/frozen.git
# Kopieren Sie den Ordner frozen/include/frozen in Ihr Projekt
# Fügen Sie den Include-Pfad zum Compiler hinzu:
# g++ -I/pfad/zu/frozen/include your_file.cpp -std=c++17

Schnellstart: Minimales funktionsfähiges Beispiel

Erstellen Sie eine Datei example.cpp mit folgendem Inhalt:

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

int main() {
    // Erstellen einer Compile-Time-Map mit perfektem Hashing
    constexpr frozen::unordered_map<frozen::string, int, 3> fruit_calories = {
        {"apple", 95},
        {"banana", 105},
        {"orange", 62}
    };

    // Laufzeitsuche — O(1), ohne Kollisionen
    std::cout << "Kalorien einer Banane: " << fruit_calories.at("banana") << "\n";

    // Prüfen, ob ein Schlüssel existiert
    if (auto it = fruit_calories.find("grape"); it != fruit_calories.end()) {
        std::cout << "Traube gefunden: " << it->second << "\n";
    } else {
        std::cout << "Traube nicht gefunden\n";
    }

    // Iteration über alle Elemente
    for (auto& [fruit, calories] : fruit_calories) {
        std::cout << fruit.data() <<                    

Empfehlungen