std::map<Key,T,Compare,Allocator>:: try_emplace
|
template
<
class
...
Args
>
std:: pair < iterator, bool > try_emplace ( const Key & k, Args && ... args ) ; |
(1) | (depuis C++17) |
|
template
<
class
...
Args
>
std:: pair < iterator, bool > try_emplace ( Key && k, Args && ... args ) ; |
(2) | (depuis C++17) |
|
template
<
class
K,
class
...
Args
>
std:: pair < iterator, bool > try_emplace ( K && k, Args && ... args ) ; |
(3) | (depuis C++26) |
|
template
<
class
...
Args
>
iterator try_emplace ( const_iterator hint, const Key & k, Args && ... args ) ; |
(4) | (depuis C++17) |
|
template
<
class
...
Args
>
iterator try_emplace ( const_iterator hint, Key && k, Args && ... args ) ; |
(5) | (depuis C++17) |
|
template
<
class
K,
class
...
Args
>
iterator try_emplace ( const_iterator hint, K && k, Args && ... args ) ; |
(6) | (depuis C++26) |
Si une clé équivalente à k existe déjà dans le conteneur, ne fait rien. Sinon, insère un nouvel élément dans le conteneur avec la clé k et la valeur construite avec args . Dans ce cas :
emplace
sauf que l'élément est construit comme
value_type ( std:: piecewise_construct ,
std::
forward_as_tuple
(
k
)
,
emplace
sauf que l'élément est construit comme
value_type ( std:: piecewise_construct ,
std::
forward_as_tuple
(
std
::
move
(
k
)
)
,
emplace
sauf que l'élément est construit comme
value_type ( std:: piecewise_construct ,
std::
forward_as_tuple
(
std::
forward
<
K
>
(
k
)
)
,
emplace_hint
sauf que l'élément est construit comme
value_type ( std:: piecewise_construct ,
std::
forward_as_tuple
(
k
)
,
emplace_hint
sauf que l'élément est construit comme
value_type ( std:: piecewise_construct ,
std::
forward_as_tuple
(
std
::
move
(
k
)
)
,
emplace_hint
sauf que l'élément est construit comme
value_type ( std:: piecewise_construct ,
std::
forward_as_tuple
(
std::
forward
<
K
>
(
k
)
)
,
value_type
n'est pas
EmplaceConstructible
dans
map
à partir de l'expression correspondante, le comportement est indéfini.
- std:: is_convertible_v < K && , const_iterator > et std:: is_convertible_v < K && , iterator > sont tous deux false .
- Le qualifié-id Compare :: is_transparent est valide et désigne un type.
Aucun itérateur ou référence n'est invalidé.
Table des matières |
Paramètres
| k | - | la clé utilisée à la fois pour la recherche et pour l'insertion si non trouvée |
| hint | - | itérateur vers la position avant laquelle le nouvel élément sera inséré |
| args | - | arguments à transmettre au constructeur de l'élément |
Valeur de retour
emplace
:
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.
emplace_hint
:
Un itérateur vers l'élément inséré, ou vers l'élément qui a empêché l'insertion.
Complexité
emplace_hint
:
Logarithmique par rapport à la taille du conteneur en général, mais constant amorti si le nouvel élément est inséré juste avant hint .
Notes
Contrairement à
insert
ou
emplace
, ces fonctions ne déplacent pas les arguments rvalue si l'insertion n'a pas lieu, ce qui facilite la manipulation des maps dont les valeurs sont de types non copiables, tels que
std::
map
<
std::
string
,
std::
unique_ptr
<
foo
>>
. De plus,
try_emplace
traite la clé et les arguments du
mapped_type
séparément, contrairement à
emplace
, qui nécessite les arguments pour construire un
value_type
(c'est-à-dire un
std::pair
).
Surcharges
(
3
)
et
(
6
)
peuvent être appelées sans construire un objet de type
Key
.
| Macro de test de fonctionnalité | Valeur | Norme | Fonctionnalité |
|---|---|---|---|
__cpp_lib_map_try_emplace
|
201411L
|
(C++17) |
std::map::try_emplace
,
std::map::insert_or_assign
|
__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 non ordonnés . Surcharges ( 3 ) et ( 6 ) . |
Exemple
#include <iostream> #include <string> #include <map> #include <utility> void print_node(const auto& node) { std::cout << '[' << node.first << "] = " << node.second << '\n'; } void print_result(auto const& pair) { std::cout << (pair.second ? "inserted: " : "ignored: "); print_node(*pair.first); } int main() { using namespace std::literals; std::map<std::string, std::string> m; print_result(m.try_emplace("a", "a"s)); print_result(m.try_emplace("b", "abcd")); print_result(m.try_emplace("c", 10, 'c')); print_result(m.try_emplace("c", "Won't be inserted")); for (const auto& p : m) print_node(p); }
Sortie :
inserted: [a] = a inserted: [b] = abcd inserted: [c] = cccccccccc ignored: [c] = cccccccccc [a] = a [b] = abcd [c] = cccccccccc
Voir aussi
|
(C++11)
|
construit un élément en place
(fonction membre publique) |
|
(C++11)
|
construit des éléments en place en utilisant un indice
(fonction membre publique) |
|
insère des éléments
ou des nœuds
(depuis C++17)
(fonction membre publique) |