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
insertca să actualizezi o valoare și nu se întâmplă nimic. Pentru „adaugă sau înlocuiește” foloseștem[cheie] = valoaresauinsert_or_assign. - Ignori rezultatul și nu afli că cheia exista deja. Verifică
.secondcâ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ă.