std::flat_map în C++

Dicționar ordonat ca std::map, dar ținut în doi vectori sortați: căutare și parcurgere rapide, inserare mai lentă.

Sintaxă
#include <flat_map>

std::flat_map<Cheie, Valoare> nume;

Ce face std::flat_map

std::flat_map are aproape aceeași interfață ca std::map (operator[], at, find, contains, insert, erase), dar nu folosește un arbore. Cheile stau sortate într-un vector, iar valorile în alt vector, pe aceleași poziții. Le poți vedea direct cu keys() și values().

Căutarea este o căutare binară într-un vector, deci rapidă și prietenoasă cu memoria cache; parcurgerea este la fel de rapidă ca la un vector. În schimb, inserarea sau ștergerea la mijloc mută elementele de după, ca la std::vector, și invalidează iteratorii. Este potrivit pentru date construite o dată și citite des (configurări, tabele de traduceri).

Parametri

Parametru Descriere
Cheie, Valoare Ca la std::map.

Ce returnează

Un obiect flat_map.

Exemple

Exemplul 1: Traduceri citite des

#include <flat_map>
#include <print>
#include <string>

int main() {
    std::flat_map<std::string, std::string> traduceri{
        {"hello", "salut"}, {"bread", "pâine"}, {"apple", "măr"},
    };
    traduceri["water"] = "apă";

    std::println("{}", traduceri);
    std::println("chei:    {}", traduceri.keys());
    std::println("valori:  {}", traduceri.values());
    if (auto it = traduceri.find("bread"); it != traduceri.end()) {
        std::println("bread = {}", it->second);
    }
}

Rezultat

{"apple": "măr", "bread": "pâine", "hello": "salut", "water": "apă"}
chei:    ["apple", "bread", "hello", "water"]
valori:  ["măr", "pâine", "salut", "apă"]
bread = pâine

Greșeli frecvente

  • Folosești std::flat_map pentru date în care inserezi și ștergi des, în ordine aleatorie. Fiecare inserare mută elemente; acolo std::map sau std::unordered_map sunt mai potrivite.
  • Păstrezi iteratori sau referințe după o inserare. Ca la vector, ele pot deveni invalide.

Comenzi înrudite

  • std::map: Dicționar ordonat: asociază fiecărei chei unice o valoare și păstrează cheile sortate.
  • std::vector: Tabloul dinamic din C++: ține elementele unul după altul în memorie și își mărește singur dimensiunea.
  • std::unordered_map: Dicționar bazat pe tabelă hash: căutare în timp mediu constant, dar fără o ordine anume a elementelor.