std::unordered_map<Key,T,Hash,KeyEqual,Allocator>:: insert
|
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.
[
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
).
[
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.
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
insert_return_type
avec les membres initialisés comme suit :
-
Si
nh
est vide,
insertedest false ,positionest end ( ) , etnodeest vide. -
Sinon, si l'insertion a eu lieu,
insertedest true ,positionpointe vers l'élément inséré, etnodeest vide. -
Si l'insertion a échoué,
insertedest false ,nodea la valeur précédente de nh , etpositionpointe vers un élément avec une clé équivalente à nh. key ( ) .
Exceptions
Complexité
O(1)
, cas le plus défavorable
O(size())
.
O(N)
, où N est le nombre d'éléments à insérer. Cas le plus défavorable :
O(N * size() + N)
.
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) |
|
|
(C++17)
|
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) |