Maison >développement back-end >C++ >Push_back vs Emplace_back : quand devez-vous utiliser chacun en C ?

Push_back vs Emplace_back : quand devez-vous utiliser chacun en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-23 09:47:29717parcourir

Push_back vs. Emplace_back: When Should You Use Each in C  ?

Push_back vs Emplace_back : une analyse plus approfondie

Introduction

La distinction entre push_back et emplace_back Les opérations en C sont souvent source de confusion. Les deux fonctions sont utilisées pour insérer des éléments dans un conteneur, mais elles diffèrent par leur comportement, en particulier lorsque vous travaillez avec des références rvalue.

Comprendre Push_back

push_back a trois surcharges : l'un prenant une valeur const, l'autre prenant une référence rvalue et un autre prenant un nombre variadique d'arguments (à partir de C 11). Dans le contexte des références rvalue, push_back(Type&& _Val) se comporte comme prévu : il insère directement la référence rvalue dans le conteneur sans créer de copie.

Émergence d'Emplace_back

Microsoft Visual C (MSVC) a introduit une version apparemment redondante de emplace_back qui prend une référence rvalue : emplace_back(Type&& _Val). Cette surcharge est redondante car elle est fonctionnellement équivalente à push_back(Type&& _Val) lorsqu'elle est utilisée avec une référence rvalue.

Le vrai pouvoir d'Emplace_back

Le vrai pouvoir d'Emplace_back

Le vrai Le potentiel de emplace_back réside dans sa surcharge variadique : emplace_back(Args&&...). Contrairement à push_back, cette surcharge permet la construction directe d'objets dans un conteneur à l'aide d'arguments transmis. Cela élimine le besoin de créer des objets temporaires et le risque de copie inutile.

Quand utiliser Emplace_back

std::map<int, Complicated> m;
int anInt = 4;
double aDouble = 5.0;
std::string aString = "C++";

// Avoids creating temporary objects
m.emplace(4, anInt, aDouble, aString);

emplace_back est particulièrement utile dans les situations où la création d'objets temporaires entraînerait des coûts importants. aérien. Par exemple, lors de l'insertion d'un objet complexe dans une carte standard :

Implémentation partielle de MSVC

Malgré l'introduction d'une surcharge emplace_back non standard pour les références rvalue, MSVC n'a pas encore implémenté la version variadique complète. La raison en est le manque de prise en charge des modèles variadiques dans Visual C 10 à l'époque.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn