std::unordered_set<Key,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++11) |
|
iterator insert
(
const_iterator hint,
const
value_type
&
value
)
;
|
(3) | (depuis C++11) |
|
iterator insert
(
const_iterator hint, value_type
&&
value
)
;
|
(4) | (depuis C++11) |
|
template
<
class
InputIt
>
void insert ( InputIt first, InputIt last ) ; |
(5) | (depuis C++11) |
|
void
insert
(
std::
initializer_list
<
value_type
>
ilist
)
;
|
(6) | (depuis C++11) |
|
insert_return_type insert
(
node_type
&&
nh
)
;
|
(7) | (depuis C++17) |
|
iterator insert
(
const_iterator hint, node_type
&&
nh
)
;
|
(8) | (depuis C++17) |
|
template
<
class
K
>
std:: pair < iterator, bool > insert ( K && obj ) ; |
(9) | (depuis C++23) |
|
template
<
class
K
>
iterator insert ( const_iterator hint, K && obj ) ; |
(10) | (depuis C++23) |
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
).
u
de
value_type
avec
std::
forward
<
K
>
(
obj
)
et insère ensuite
u
dans
*
this
. Si
equal_range
(
u
)
!
=
hash_function
(
)
(
obj
)
||
contains
(
u
)
est
true
, le comportement est indéfini. Le
value_type
doit être
EmplaceConstructible
dans
unordered_set
à partir de
std::
forward
<
K
>
(
obj
)
. Cette surcharge participe à la résolution de surcharge seulement si
Hash
et
KeyEqual
sont tous deux
transparents
. Cela suppose qu'un tel
Hash
peut être appelé avec à la fois le type
K
et le type
Key
, et que le
KeyEqual
est transparent, ce qui, ensemble, permet d'appeler cette fonction sans construire une instance de
Key
.
Sinon, construit un objet
u
de type
value_type
avec
std::
forward
<
K
>
(
obj
)
puis insère
u
dans
*
this
.
Template:hint
est utilisé comme suggestion non contraignante pour l'emplacement où la recherche devrait commencer. Si
equal_range
(
u
)
!
=
hash_function
(
)
(
obj
)
||
contains
(
u
)
est
true
, le comportement est indéfini.
Le
value_type
doit être
EmplaceConstructible
dans
unordered_set
à partir de
std::
forward
<
K
>
(
obj
)
. Cette surcharge participe à la résolution de surcharge seulement si :
- std:: is_convertible_v < K && , const_iterator > et std:: is_convertible_v < K && , iterator > sont tous deux false , et
-
Hash
::
is_transparent
et
KeyEqual
::
is_transparent
sont valides et chacun désigne un type. Cela suppose qu'un tel
Hashpeut être appelé avec à la fois le typeKet le typeKey, et que leKeyEqualest transparent,
Key
.
Si après l'opération le nouveau nombre d'éléments est supérieur à 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 (pas de 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 |
| obj | - | une valeur de type quelconque pouvant être comparée de manière transparente avec une clé |
| 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
|
Cette section est incomplète
Raison : cas 5-10 |
Complexité
O(1)
, cas le pire
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
(
(
3,4
)
,
(
8
)
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.
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_associative_heterogeneous_insertion
|
202311L
|
(C++26) | Surcharges hétérogènes pour les fonctions membres restantes dans les conteneurs associatifs ordonnés et conteneurs associatifs non ordonnés . ( 9,10 ) |
Exemple
#include <array> #include <iostream> #include <unordered_set> std::ostream& operator<<(std::ostream& os, std::unordered_set<int> const& s) { for (os << '[' << s.size() << "] { "; int i : s) os << i << ' '; return os << "}\n"; } int main () { std::unordered_set<int> nums{2, 3, 4}; std::cout << "1) Initially: " << nums << std::boolalpha; auto p = nums.insert(1); // insert element, overload (1) std::cout << "2) '1' was inserted: " << p.second << '\n'; std::cout << "3) After insertion: " << nums; nums.insert(p.first, 0); // insert with hint, overload (3) std::cout << "4) After insertion: " << nums; std::array<int, 4> a = {10, 11, 12, 13}; nums.insert(a.begin(), a.end()); // insert range, overload (5) std::cout << "5) After insertion: " << nums; nums.insert({20, 21, 22, 23}); // insert initializer_list, (6) std::cout << "6) After insertion: " << nums; std::unordered_set<int> other_nums = {42, 43}; auto node = other_nums.extract(other_nums.find(42)); nums.insert(std::move(node)); // insert node, overload (7) std::cout << "7) After insertion: " << nums; node = other_nums.extract(other_nums.find(43)); nums.insert(nums.begin(), std::move(node)); // insert node with hint, (8) std::cout << "8) After insertion: " << nums; }
Sortie possible :
1) Initially: [3] { 4 3 2 }
2) '1' was inserted: true
3) After insertion: [4] { 1 2 3 4 }
4) After insertion: [5] { 0 1 2 3 4 }
5) After insertion: [9] { 13 12 11 10 4 3 2 1 0 }
6) After insertion: [13] { 23 22 13 12 11 10 21 4 20 3 2 1 0 }
7) After insertion: [14] { 42 23 22 13 12 11 10 21 4 20 3 2 1 0 }
8) After insertion: [15] { 43 42 23 22 13 12 11 10 21 4 20 3 2 1 0 }
Voir aussi
|
construit un élément en place
(fonction membre publique) |
|
|
construit des éléments en place en utilisant un indice
(fonction membre publique) |
|
|
crée un
std::insert_iterator
du type déduit de l'argument
(fonction template) |