Quelle est la différence entre unordered_map :: emplace et unordered_map :: insert en C++?
Quelle est la différence entre std::unordered_map::emplace
et std::unordered_map::insert
en C++?
Prises à partir d'un référence: Attention, l'utilisation de emplace permet le nouvel élément à être construit tout en évitant les copier ou de déplacer des opérations. Le constructeur de l'élément nouveau (c'est à dire
emplace crée un nouvel objet alors que d'insérer prend un objet existant. Les paramètres sont différents comme emplace prend les arguments du constructeur. Si vous n'avez pas une instance déjà existante à insérer, à l'utilisation emplace.
std::pair<const Key, T>
) est appelée avec exactement les mêmes arguments que fourni à l'emplace, transmis via std::forward<Args>(args)...
.emplace crée un nouvel objet alors que d'insérer prend un objet existant. Les paramètres sont différents comme emplace prend les arguments du constructeur. Si vous n'avez pas une instance déjà existante à insérer, à l'utilisation emplace.
OriginalL'auteur Harsh M. Shah | 2014-10-19
Vous devez vous connecter pour publier un commentaire.
unordered_map::insert
copie ou déplace une paire clé-valeur dans le récipient. Il est surchargé d'accepter de référence-à-const ou une référence rvalue:unordered_map::emplace
vous permet de vous éviter d'inutiles copie ou déplace par la construction de l'élément en place. Il utilise le transfert parfait et un variadic template pour des arguments au constructeur de la paire clé-valeur:Mais il y a beaucoup de chevauchement entre les deux fonctions.
emplace
peut être utilisé à l'avant de la copier/déplacer constructeur de la paire clé-valeur qui lui permet d'être utilisé commeinsert
serait. Cela signifie que l'utilisation deemplace
ne garantit pas que vous allez éviter les copies ou se déplace. Aussi la version deinsert
qui prend une rvalue-référence est en fait basé sur un modèle et accepte tout typeP
tels que la paire clé-valeur est constructible à partir deP
.Scott Meyers dit:
( Edit: Howard Hinnant couru certaines expériences qui a montré parfois
insert
est plus rapide queemplace
)Si vous certainement ne voulez copier/déplacer dans le conteneur, il peut être judicieux d'utiliser
insert
parce que vous êtes plus susceptibles d'obtenir une erreur de compilation si vous passez des arguments incorrects. Vous devez être plus prudent, vous êtes de passage le bon arguments pour la mise en place de fonctions.La plupart des implémentations de
unordered_map::emplace
sera la cause de la mémoire allouée dynamiquement pour la nouvelle paire même si la carte contient un élément qui touche déjà et laemplace
échouera. Cela signifie que si il ya une bonne chance qu'unemplace
échoue, vous pourrez obtenir de meilleures performances en utilisant insert pour éviter inutile dynamique de l'allocation mémoire.Petit exemple:
Edit2: Sur demande. Il est également possible d'utiliser
unordered_map::emplace
avec une clé ou une valeur qui prend plus d'un paramètre du constructeur. À l'aide de lastd::pair
par morceaux constructeur vous pouvez toujours éviter les copies ou se déplace.voir également ne fonctionne pas pour moi sur firefox mobile
Hélas, personne n'a jamais montre un exemple de map<T1, T2> où les constructeurs pour T1 et T2 prendre plus qu'un seul argument. J'utilise souvent des choses comme map<string, classWithTwoParamConstructor>.
J'ai mis à jour la citation pour correspondre à ce qui est dans la version imprimée de Moderne et Efficace de C++ (l'Article 42 de la page 301). Je pense que l'autre raison, c'est "prendre en considération" et pas "Préfèrent" est lorsque vous utilisez un emplacement fonction, vous devez être prudent et assurez-vous que vous êtes en passant les arguments corrects parce que la mise en place de fonctions peuvent effectuer des conversions qui serait rejetée par l'insertion de fonctions.
J'ai ajouté un exemple avec un
T2
qui est construit avec plus qu'un seul argument.OriginalL'auteur