Containere Asociative Secvențiale Cache-Friendly cu std::flat_map în C++23 în C++

Ghid de performanță pentru std::flat_map și std::flat_set în C++23: stocarea cheilor și valorilor în vectori paraleli contigui în loc de arbori roșu-negru nodali, maximizând localitatea cache-ului CPU (L1/L2) și căutarea binară ultra-rapidă.

Sintaxă
#include <flat_map> | std::flat_map<std::string, int> m; m["test"] = 10;

Containerul clasic std::map este implementat intern ca un arbore echilibrat roșu-negru (Red-Black Tree). Deși oferă o complexitate teoretică excelentă de căutare $O(\log N)$, fiecare nod este o alocare independentă pe heap. Când arborele este traversat, procesorul sare haotic între adrese de memorie dispersate (Pointer Chasing), generând sute de Cache Misses în ierarhia de memorie a CPU-ului. Introdus în C++23, adaptorul std::flat_map stochează cheile și valorile în vectori contigui separați, oferind căutare binară de până la 10 ori mai rapidă datorită localității maxime a cache-ului hardware.

Utilizarea std::flat_map în C++23
#include <flat_map>
#include <string>
#include <print>

int main() {
    // Interfață 100% identică cu std::map, dar memorie 100% contiguă:
    std::flat_map<std::string, double> preturiProduse;

    preturiProduse["Monitor 4K"] = 1899.99;
    preturiProduse["Tastatura Mecanica"] = 450.00;
    preturiProduse["Mouse Wireless"] = 280.50;

    // Căutare ultra-rapidă prin bisection search în vectorul intern de chei:
    if (auto it = preturiProduse.find("Monitor 4K"); it != preturiProduse.end()) {
        std::println("Pret gasit: {:.2f} RON", it->second);
    }

    // Extracția directă a vectorilor subiacenți fără copiere:
    auto containere = std::move(preturiProduse).extract();
    std::println("Numar chei contigue: {}", containere.keys.size());
    return 0;
}
Când este indicat std::flat_map: Este alegerea perfectă pentru colecții mici și medii (până la zeci de mii de elemente) care sunt populate o singură dată la inițializare și citite frecvent. Dacă aplicația face milioane de inserții și ștergeri aleatorii în timp real, std::map sau std::unordered_map rămân de preferat pentru a evita re-ordonarea vectorului contiguu.