ホームページ > バックエンド開発 > C++ > Push_back と Emplace_back: C でそれぞれをいつ使用する必要がありますか?

Push_back と Emplace_back: C でそれぞれをいつ使用する必要がありますか?

Mary-Kate Olsen
リリース: 2024-12-23 09:47:29
オリジナル
715 人が閲覧しました

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

Push_back と Emplace_back: より深い分析

はじめに

push_back と emplace_back の違いC での演算は混乱の原因となることがよくあります。どちらの関数もコンテナに要素を挿入するために使用されますが、特に右辺値参照を操作する場合の動作が異なります。

Push_back について

push_back には 3 つのオーバーロードがあります。 1 つは const 値を受け取り、もう 1 つは右辺値参照を受け取り、もう 1 つは可変長の引数を受け取ります (C 11 以降)。右辺値参照のコンテキストでは、push_back(Type&& _Val) は期待どおりに動作します。つまり、コピーを作成せずに右辺値参照をコンテナに直接挿入します。

Emplace_back の出現

Microsoft Visual C (MSVC) は、一見冗長なバージョンの emplace_back を導入しました。右辺値参照: emplace_back(Type&& _Val)。このオーバーロードは、右辺値参照とともに使用した場合、push_back(Type&& _Val) と機能的に同等であるため、冗長です。

Emplace_back の真の力

真emplace_back の可能性は、その可変引数オーバーロード emplace_back(Args&&...) にあります。 Push_back とは異なり、このオーバーロードでは、転送された引数を使用してコンテナー内でオブジェクトを直接構築できます。これにより、一時オブジェクトを作成する必要がなく、不必要なコピーが行われる可能性がなくなります。

Emplace_back を使用する場合

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);
ログイン後にコピー

MSVC の部分実装

右辺値参照に非標準の emplace_back オーバーロードを導入しているにもかかわらず、MSVC は完全な可変個引数バージョンはまだ実装されていません。この背後にある理由は、当時 Visual C 10 で可変個引数テンプレートがサポートされていなかったことです。

以上がPush_back と Emplace_back: C でそれぞれをいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート