Namespaces
Variants

std::unordered_map<Key,T,Hash,KeyEqual,Allocator>:: insert

From cppreference.net
std:: pair < iterator, bool > insert ( const value_type & value ) ;
(1) (depuis C++11)
std:: pair < iterator, bool > insert ( value_type && value ) ;
(2) (depuis C++17)
template < class P >
std:: pair < iterator, bool > insert ( P && value ) ;
(3) (depuis C++11)
iterator insert ( const_iterator hint, const value_type & value ) ;
(4) (depuis C++11)
iterator insert ( const_iterator hint, value_type && value ) ;
(5) (depuis C++17)
template < class P >
iterator insert ( const_iterator hint, P && value ) ;
(6) (depuis C++11)
template < class InputIt >
void insert ( InputIt first, InputIt last ) ;
(7) (depuis C++11)
void insert ( std:: initializer_list < value_type > ilist ) ;
(8) (depuis C++11)
insert_return_type insert ( node_type && nh ) ;
(9) (depuis C++17)
iterator insert ( const_iterator hint, node_type && nh ) ;
(10) (depuis C++17)

Insère un ou plusieurs éléments dans le conteneur, si celui-ci ne contient pas déjà un élément avec une clé équivalente.

1-3) Insère value .
La surcharge (3) est équivalente à emplace ( std:: forward < P > ( value ) ) et ne participe à la résolution de surcharge que si std:: is_constructible < value_type, P && > :: value == true .
4-6) Insère value , en utilisant hint comme suggestion non contraignante pour l'endroit où la recherche devrait commencer.
La surcharge (6) est équivalente à emplace_hint ( hint, std:: forward < P > ( value ) ) et ne participe à la résolution de surcharge que si std:: is_constructible < value_type, P && > :: value == true .
7) Insère les éléments de la plage [ first , last ) . Si plusieurs éléments dans la plage ont des clés qui sont équivalentes, il n'est pas spécifié quel élément est inséré (en attente de LWG2844 ).
Si [ first , last ) n'est pas un intervalle valide , ou si first et/ou last sont des itérateurs dans * this , le comportement est indéfini.
8) Insère les éléments de la liste d'initialisation ilist . Si plusieurs éléments dans la plage ont des clés qui sont équivalentes, il n'est pas spécifié quel élément est inséré (en attente de LWG2844 ).
9) Si nh est un node handle vide, ne fait rien. Sinon, insère l'élément possédé par nh dans le conteneur, si le conteneur ne contient pas déjà un élément avec une clé équivalente à nh. key ( ) . Le comportement est indéfini si nh n'est pas vide et get_allocator ( ) ! = nh. get_allocator ( ) .
10) Si nh est un node handle vide, ne fait rien et retourne l'itérateur de fin. Sinon, insère l'élément possédé par nh dans le conteneur, si le conteneur ne contient pas déjà un élément avec une clé équivalente à nh. key ( ) , et retourne l'itérateur pointant vers l'élément avec la clé équivalente à nh. key ( ) (que l'insertion ait réussi ou échoué). Si l'insertion réussit, nh est déplacé, sinon il conserve la possession de l'élément. hint est utilisé comme suggestion non contraignante pour indiquer où la recherche devrait commencer. Le comportement est indéfini si nh n'est pas vide et get_allocator ( ) ! = nh. get_allocator ( ) .

Si après l'opération le nouveau nombre d'éléments dépasse l'ancien max_load_factor() * bucket_count() un rehashing a lieu.
Si un rehashing se produit (en raison de l'insertion), tous les itérateurs sont invalidés. Sinon (aucun rehashing), les itérateurs ne sont pas invalidés. Si l'insertion réussit, les pointeurs et références vers l'élément obtenus pendant qu'il est détenu dans le node handle sont invalidés, et les pointeurs et références obtenus vers cet élément avant son extraction redeviennent valides. (depuis C++17)

Table des matières

Paramètres

hint - itérateur, utilisé comme suggestion pour l'emplacement d'insertion du contenu
value - valeur de l'élément à insérer
first, last - paire d'itérateurs définissant la plage source des éléments à insérer
ilist - liste d'initialisation depuis laquelle insérer les valeurs
nh - un gestionnaire de nœud compatible
Exigences de type
-
InputIt doit satisfaire aux exigences de LegacyInputIterator .

Valeur de retour

1-3) 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 une valeur bool définie à true si et seulement si l'insertion a eu lieu.
4-6) Un itérateur vers l'élément inséré, ou vers l'élément qui a empêché l'insertion.
7,8) (aucun)
9) Un objet de insert_return_type avec les membres initialisés comme suit :
  • Si nh est vide, inserted est false , position est end ( ) , et node est vide.
  • Sinon, si l'insertion a eu lieu, inserted est true , position pointe vers l'élément inséré, et node est vide.
  • Si l'insertion a échoué, inserted est false , node a la valeur précédente de nh , et position pointe vers un élément avec une clé équivalente à nh. key ( ) .
10) Itérateur de fin si nh était vide, itérateur pointant vers l'élément inséré si l'insertion a eu lieu, et itérateur pointant vers un élément avec une clé équivalente à nh. key ( ) si elle a échoué.

Exceptions

1-6) Si une exception est levée pour quelque raison que ce soit, ces fonctions n'ont aucun effet ( strong exception safety guarantee ).
7,8) Aucune garantie de sûreté vis-à-vis des exceptions.
9,10) Si une exception est levée pour quelque raison que ce soit, ces fonctions n'ont aucun effet ( strong exception safety guarantee ).

Complexité

1-6) Cas moyen : O(1) , cas le plus défavorable O(size()) .
7,8) Cas moyen : O(N) , où N est le nombre d'éléments à insérer. Cas le plus défavorable : O(N * size() + N) .
9,10) Cas moyen : O(1) , cas le plus défavorable O(size()) .

Notes

L'insertion avec indice ( ( 4-6 ) et ( 10 ) ) ne retourne pas un booléen afin d'être compatible en signature avec l'insertion positionnelle sur les conteneurs séquentiels, tels que std::vector::insert . Cela permet de créer des inserters génériques tels que std::inserter . Une manière de vérifier le succès d'une insertion avec indice est de comparer size() avant et après.

Exemple

#include <iostream>
#include <string>
#include <unordered_map>
int main ()
{
    std::unordered_map<int, std::string> dict = {{1, "one"}, {2, "two"}};
    dict.insert({3, "three"});
    dict.insert(std::make_pair(4, "four"));
    dict.insert({{4, "another four"}, {5, "five"}});
    const bool ok = dict.insert({1, "another one"}).second;
    std::cout << "inserting 1 => \"another one\" "
              << (ok ? "succeeded" : "failed") << '\n';
    std::cout << "contents:\n";
    for (auto& p : dict)
        std::cout << ' ' << p.first << " => " << p.second << '\n';
}

Sortie possible :

inserting 1 => "another one" failed
contents:
 5 => five
 1 => one
 2 => two
 3 => three
 4 => four

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
LWG 2005 C++11 les surcharges ( 3 ) et ( 6 ) ne participaient à la résolution de surcharge
que si P est implicitement convertible en value_type
ne participe que si value_type
est constructible à partir de P &&

Voir aussi

construit un élément en place
(fonction membre publique)
construit des éléments en place en utilisant un indice
(fonction membre publique)
insère un élément ou assigne à l'élément courant si la clé existe déjà
(fonction membre publique)
crée un std::insert_iterator du type déduit de l'argument
(fonction template)