Insérer de nouveaux éléments dans une carte STL en C++
-
Utilisez la fonction membre
insert
pour ajouter un nouvel élément àstd::map
en C++ -
Utilisez la fonction membre
insert_or_assign
pour ajouter un nouvel élément àstd::map
en C++ -
Utilisez la fonction membre
emplace
pour ajouter un nouvel élément àstd::map
en C++ -
Utilisez la fonction membre
emplace_hint
pour ajouter un nouvel élément àstd::map
en C++
Cet article expliquera plusieurs méthodes pour ajouter de nouveaux éléments dans l’objet std::map
en C++.
Utilisez la fonction membre insert
pour ajouter un nouvel élément à std::map
en C++
Le conteneur STL map
fournit une structure de données pour stocker des paires clé-valeur sous forme d’éléments, triés automatiquement lors de l’insertion ou de l’initialisation. De nouveaux éléments peuvent être ajoutés à un objet std::map
en utilisant plusieurs méthodes, dont la plus courante est la fonction insert
.
La fonction membre insert
a plusieurs surcharges. Pourtant, le plus simple ne prend qu’un seul argument spécifiant la référence const
à l’objet inséré. Une autre surcharge peut accepter une référence de valeur r et utiliser la commande std::forward
pour construire un élément sur place, comme illustré dans l’exemple de code suivant.
Cette dernière surcharge renvoie une paire de l’itérateur à l’élément inséré et la valeur bool
, indiquant une insertion réussie. Nous démontrons également une surcharge de la fonction insert
qui prend une liste de valeurs-clés similaire à la liste d’initialisation et construit des éléments à partir des valeurs. Cependant, cette surcharge n’a pas de type de retour.
#include <iostream>
#include <map>
using std::cout;
using std::endl;
using std::map;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::map<string, string> m1 = {
{"h", "htop"},
{"k", "ktop"},
};
auto ret = m1.insert({"k", "ktop"});
ret.second ? cout << "Inserted" : cout << "Not Inserted";
cout << "\n";
m1.insert({{"k", "ktop"}, {"p", "ptop"}});
printMap(m1);
return EXIT_SUCCESS;
}
Production:
Not Inserted h : htop;
k : ktop;
p : ptop;
Utilisez la fonction membre insert_or_assign
pour ajouter un nouvel élément à std::map
en C++
La nouvelle norme C++17 fournit une fonction membre appelée insert_or_assign
, qui insère un nouvel élément dans une carte si la clé donnée n’existe pas déjà. Sinon, la fonction affectera la nouvelle valeur à l’élément avec la clé existante.
La fonction a plusieurs surcharges, mais celle appelée dans l’exemple suivant prend deux arguments comme références de valeur r à une clé et à une valeur. Cette surcharge renvoie également une paire d’itérateur et une valeur bool
. Notez que nous vérifions l’état de l’insertion avec un opérateur conditionnel et imprimons les messages correspondants.
#include <iostream>
#include <map>
using std::cout;
using std::endl;
using std::map;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::map<string, string> m1 = {
{"h", "htop"},
{"k", "ktop"},
};
auto ret = m1.insert_or_assign("p", "ptop");
ret.second ? cout << "Inserted" : cout << "Assigned";
cout << "\n";
ret = m1.insert_or_assign("t", "ttop");
ret.second ? cout << "Inserted" : cout << "Assigned";
cout << "\n";
printMap(m1);
return EXIT_SUCCESS;
}
Production:
Inserted Inserted h : htop;
k : ktop;
p : ptop;
t : ttop;
Utilisez la fonction membre emplace
pour ajouter un nouvel élément à std::map
en C++
Une autre fonction membre fournie avec le conteneur std::map
est emplace
. Cette fonction offre une efficacité contrairement à la fonction insert
car elle ne nécessite pas de copier les valeurs des arguments. Au contraire, la fonction emplace
construira l’élément en place, ce qui signifie que les paramètres donnés sont transmis au constructeur de la classe. Notez qu’en fonction des arguments, le constructeur correspondant sera appelé.
#include <iostream>
#include <map>
using std::cout;
using std::endl;
using std::map;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::map<string, string> m1 = {
{"h", "htop"},
{"k", "ktop"},
};
auto ret = m1.emplace("t", "ttop");
ret.second ? cout << "Inserted" : cout << "Not Inserted";
cout << endl;
ret = m1.emplace(std::make_pair("t", "ttop"));
ret.second ? cout << "Inserted" : cout << "Not Inserted";
cout << endl;
printMap(m1);
return EXIT_SUCCESS;
}
Production:
Inserted Not Inserted h : htop;
k : ktop;
t : ttop;
Utilisez la fonction membre emplace_hint
pour ajouter un nouvel élément à std::map
en C++
Alternativement, on peut utiliser la fonction membre emplace_hint
pour insérer un nouvel élément dans une carte avec un paramètre supplémentaire appelé hint
, qui spécifie une position où l’opération doit commencer la recherche. Il renverrait un itérateur à l’élément nouvellement inséré si le processus réussissait. Sinon, l’itérateur de l’élément existant avec la même clé est renvoyé.
#include <iostream>
#include <map>
using std::cout;
using std::endl;
using std::map;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::map<string, string> m1 = {
{"h", "htop"},
{"k", "ktop"},
};
auto ret = m1.emplace_hint(m1.begin(), "t", "ttop");
m1.emplace_hint(ret, "m", "mtop");
m1.emplace_hint(m1.begin(), "p", "ptop");
printMap(m1);
return EXIT_SUCCESS;
}
Production:
h : htop;
k : ktop;
m : mtop;
p : ptop;
t : ttop;
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook