Namespaces
Variants

std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>:: emplace

From cppreference.net

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.

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)