std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>:: emplace
|
template
<
class
...
Args
>
std:: pair < iterator, bool > emplace ( Args && ... args ) ; |
(depuis C++23)
(constexpr depuis C++26) |
|
Insère un nouvel élément dans le conteneur construit sur place avec les args donnés, s'il n'existe aucun élément avec la clé dans le conteneur.
Initialise un objet t de type std:: pair < key_type, mapped_type > avec std:: forward < Args > ( args ) ... ; si la map contient déjà un élément dont la clé est équivalente à t. first , * this reste inchangé. Sinon, équivalent à :
auto key_it = ranges::upper_bound(c.keys, t.first, compare); auto value_it = c.values.begin() + std::distance(c.keys.begin(), key_it); c.keys.insert(key_it, std::move(t.first)); c.values.insert(value_it, std::move(t.second));
Cette surcharge participe à la résolution de surcharge seulement si std:: is_constructible_v < std:: pair < key_type, mapped_type > , Args... > est true .
Si
value_type
n'est pas
EmplaceConstructible
dans
flat_map
à partir de
args
, le comportement est indéfini.
| Les informations sur l'invalidation des itérateurs sont copiées depuis ici |
Table des matières |
Paramètres
| args | - | arguments à transmettre au constructeur de l'élément |
Valeur de retour
Une paire constituée d'un itérateur vers l'élément inséré (ou vers l'élément qui a empêché l'insertion) et d'une bool valeur définie à true si et seulement si l'insertion a eu lieu.
Exceptions
Si une exception est levée pour quelque raison que ce soit, cette fonction n'a aucun effet ( garantie forte de sûreté face aux exceptions ).
Complexité
Si une insertion se produit, linéaire par rapport à la taille du conteneur, sinon logarithmique par rapport à la taille du conteneur
Notes
L'utilisation judicieuse de
emplace
permet de construire le nouvel élément tout en évitant les opérations inutiles de copie ou de déplacement.
Exemple
#include <iostream> #include <string> #include <utility> #include <flat_map> int main() { std::flat_map<std::string, std::string> m; // utilise le constructeur de déplacement de pair m.emplace(std::make_pair(std::string("a"), std::string("a"))); // utilise le constructeur de conversion de pair m.emplace(std::make_pair("b", "abcd")); // utilise le constructeur template de pair m.emplace("d", "ddd"); // emplace avec une clé dupliquée n'a aucun effet m.emplace("d", "DDD"); // utilise le constructeur piecewise de pair m.emplace(std::piecewise_construct, std::forward_as_tuple("c"), std::forward_as_tuple(10, 'c')); // une alternative est : m.try_emplace("c", 10, 'c'); for (const auto& p : m) std::cout << p.first << " => " << p.second << '\n'; }
Sortie :
a => a b => abcd c => cccccccccc d => ddd
Voir aussi
|
construit des éléments en place en utilisant un indice
(fonction membre publique) |
|
|
insère en place si la clé n'existe pas, ne fait rien si la clé existe
(fonction membre publique) |
|
|
insère des éléments
(fonction membre publique) |