std::map::extract în C++

extract() scoate un nod din map fără să-l distrugă (îi poți schimba cheia); merge() mută nodurile din alt map.

Sintaxă
node_type extract(const Cheie& cheie);
node_type extract(const_iterator poz);

template<class C2>
void merge(std::map<Cheie, Valoare, C2>& sursa);

Ce face std::map::extract

extract scoate elementul din map și îl returnează ca „nod” independent (node_type). Elementul nu este copiat și nici distrus. Poți modifica cheia nodului (nod.key()), lucru imposibil cât timp elementul este în map, și apoi îl pui înapoi, sau în alt map, cu insert(std::move(nod)). Dacă cheia nu există, nodul returnat este gol.

a.merge(b) mută în a toate nodurile din b ale căror chei nu există în a. Nodurile cu chei duplicate rămân în b. Nu se face nicio copiere.

Parametri

Parametru Descriere
cheie / poz Elementul de extras.
sursa Pentru merge: map-ul din care se mută nodurile.

Ce returnează

extract: un nod (cu key(), mapped(), empty()). merge: nimic.

Exemple

Exemplul 1: Redenumirea unei chei

#include <map>
#include <print>
#include <string>
#include <utility>

int main() {
    std::map<std::string, int> puncte{{"Ion", 50}, {"Maria", 70}};
    auto nod = puncte.extract("Ion");
    if (!nod.empty()) {
        nod.key() = "Ioan";               // cheia se poate schimba doar în afara map-ului
        puncte.insert(std::move(nod));
    }
    std::println("{}", puncte);
}

Rezultat

{"Ioan": 50, "Maria": 70}

Exemplul 2: Unirea a două map-uri cu merge

#include <map>
#include <print>
#include <string>

int main() {
    std::map<std::string, int> depozit{{"mere", 10}, {"pere", 5}};
    std::map<std::string, int> transport{{"pere", 3}, {"prune", 8}};
    depozit.merge(transport);
    std::println("depozit:   {}", depozit);
    std::println("transport: {} (cheia duplicată a rămas aici)", transport);
}

Rezultat

depozit:   {"mere": 10, "pere": 5, "prune": 8}
transport: {"pere": 3} (cheia duplicată a rămas aici)

Greșeli frecvente

  • Crezi că merge adună valorile cheilor comune. Nu: păstrează valoarea din map-ul destinație, iar perechea duplicată rămâne în sursă.
  • Inserezi un nod gol (cheia nu exista). Verifică nod.empty() înainte de a accesa key().

Comenzi înrudite

  • std::map: Dicționar ordonat: asociază fiecărei chei unice o valoare și păstrează cheile sortate.
  • std::map::erase: Șterge din map o cheie (cu valoarea ei), elementul indicat de un iterator sau un interval.
  • std::map::insert: Adaugă o pereche cheie-valoare doar dacă cheia nu există; spune prin rezultat dacă a adăugat-o.
  • std::list::splice: splice() mută noduri dintr-o listă în alta fără copiere; merge() interclasează două liste sortate.