Maison >développement back-end >C++ >Push_back vs Emplace_back : quand devez-vous utiliser chacun en 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!