std::map::insert în C++

Adaugă o pereche cheie-valoare doar dacă cheia nu există; spune prin rezultat dacă a adăugat-o.

Sintaxă
std::pair<iterator, bool> insert(const value_type& pereche);
void insert(std::initializer_list<value_type> lista);

template<class... Args>
std::pair<iterator, bool> emplace(Args&&... argumente);   // C++11

Ce face std::map::insert

insert primește o pereche {cheie, valoare}. Dacă cheia lipsește, o adaugă; dacă există deja, nu schimbă nimic (nici valoarea). Aceasta este diferența importantă față de m[cheie] = valoare, care suprascrie.

Rezultatul este o pereche: .first este un iterator la elementul cu acea cheie (cel nou sau cel vechi), iar .second este true dacă inserarea a avut loc. emplace face același lucru, dar construiește perechea direct din argumente: m.emplace(cheie, valoare).

Pentru un map, inserarea nu invalidează niciun iterator sau referință existentă.

Parametri

Parametru Descriere
pereche Perechea {cheie, valoare} de adăugat.
lista Mai multe perechi deodată, între acolade.
argumente Pentru emplace: cheia și valoarea (sau argumentele lor de construire).

Ce returnează

std::pair<iterator, bool>: iteratorul la element și dacă s-a adăugat.

Exemple

Exemplul 1: insert nu suprascrie

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

int main() {
    std::map<std::string, std::string> capitale;
    capitale.insert({"România", "București"});
    capitale.insert({{"Franța", "Paris"}, {"Italia", "Roma"}});

    auto [it, adaugat] = capitale.insert({"România", "Iași"});
    std::println("Adăugat? {}. Valoarea rămâne: {}", adaugat, it->second);

    capitale["România"] = "Iași";     // operator[] suprascrie
    std::println("După operator[]: {}", capitale["România"]);
}

Rezultat

Adăugat? false. Valoarea rămâne: București
După operator[]: Iași

Exemplul 2: emplace și verificarea rezultatului

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

int main() {
    std::map<int, std::string> utilizatori;
    for (auto [id, nume] : {std::pair{7, "Ana"}, std::pair{3, "Dan"}, std::pair{7, "Mihai"}}) {
        if (utilizatori.emplace(id, nume).second) {
            std::println("Am înregistrat #{} {}", id, nume);
        } else {
            std::println("ID-ul {} este deja folosit de {}", id, utilizatori.at(id));
        }
    }
}

Rezultat

Am înregistrat #7 Ana
Am înregistrat #3 Dan
ID-ul 7 este deja folosit de Ana

Greșeli frecvente

  • Folosești insert ca să actualizezi o valoare și nu se întâmplă nimic. Pentru „adaugă sau înlocuiește” folosește m[cheie] = valoare sau insert_or_assign.
  • Ignori rezultatul și nu afli că cheia exista deja. Verifică .second când contează.

Comenzi înrudite

  • std::map::try_emplace: try_emplace adaugă doar dacă cheia lipsește; insert_or_assign adaugă sau înlocuiește și spune ce a făcut.
  • std::map: Dicționar ordonat: asociază fiecărei chei unice o valoare și păstrează cheile sortate.
  • std::map::find: find() caută o cheie și returnează un iterator la ea sau end(); count() și contains() spun doar dacă există.
  • std::set::insert: Adaugă o valoare în set dacă nu există deja și spune prin rezultat dacă a fost adăugată.