std::map::erase în C++

Șterge din map o cheie (cu valoarea ei), elementul indicat de un iterator sau un interval.

Sintaxă
size_type erase(const Cheie& cheie);
iterator erase(iterator poz);
iterator erase(const_iterator prim, const_iterator ultim);

Ce face std::map::erase

erase(cheie) șterge perechea cu acea cheie și returnează câte elemente a șters (0 sau 1 la std::map). erase(it) șterge elementul indicat de iterator și returnează iteratorul următorului element, util când ștergi în buclă.

Se invalidează doar iteratorii și referințele la elementele șterse; restul rămân valide. Pentru „șterge toate elementele care…” există și std::erase_if(m, conditie) (C++20).

Parametri

Parametru Descriere
cheie Cheia de șters.
poz Iterator la elementul de șters (nu end()).
prim, ultim Intervalul de șters.

Ce returnează

Numărul de elemente șterse (pentru varianta cu cheie) sau iteratorul de după ultimul element șters.

Exemple

Exemplul 1: Ștergere după cheie

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

int main() {
    std::map<std::string, int> cos{{"lapte", 2}, {"pâine", 1}, {"ouă", 10}};
    std::println("Șterse: {}", cos.erase("pâine"));
    std::println("Șterse: {}", cos.erase("kiwi"));     // nu există: 0
    std::println("{}", cos);
}

Rezultat

Șterse: 1
Șterse: 0
{"lapte": 2, "ouă": 10}

Exemplul 2: Ștergere în buclă cu iteratorul returnat

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

int main() {
    std::map<std::string, int> stoc{{"mere", 0}, {"pere", 4}, {"prune", 0}, {"struguri", 7}};
    for (auto it = stoc.begin(); it != stoc.end(); ) {
        if (it->second == 0) {
            it = stoc.erase(it);
        } else {
            ++it;
        }
    }
    std::println("{}", stoc);
}

Rezultat

{"pere": 4, "struguri": 7}

Greșeli frecvente

  • Scrii stoc.erase(it); ++it;. După ștergere, it este invalid (comportament nedefinit). Folosește it = stoc.erase(it); sau std::erase_if.

Comenzi înrudite

  • std::map: Dicționar ordonat: asociază fiecărei chei unice o valoare și păstrează cheile sortate.
  • std::erase_if: Șterge dintr-un container toate elementele egale cu o valoare (std::erase) sau care îndeplinesc o condiție (std::erase_if).
  • std::map::extract: extract() scoate un nod din map fără să-l distrugă (îi poți schimba cheia); merge() mută nodurile din alt map.
  • std::set::erase: Șterge din set o valoare, elementul indicat de un iterator sau un interval de elemente.