Push_back 與Emplace_back:深入分析
簡介
簡介push_back的操作常常是混亂的根源。這兩個函數都用於將元素插入容器中,但它們的行為不同,尤其是在使用右值引用時。
理解Push_backpush_back 有三個重載:一種採用const 值,一種採用右值引用,另一種採用可變數量的參數(C 11 及以上)。在右值引用的上下文中,push_back(Type&& _Val) 的行為符合預期:它直接將右值參考插入到容器中,而不建立副本。
Emplace_back 的出現Microsoft Visual C (MSVC) 引入了一個看似冗餘的 emplace_back 版本,它採用右值引用: emplace_back(類型&&_Val)。此重載是多餘的,因為與右值參考一起使用時,它在功能上等同於 Push_back(Type&& _Val)。
Emplace_back 的真正威力真正的emplace_back 的潛力在於其可變參數重載:emplace_back(Args&&...)。與push_back不同,此重載允許使用轉送參數直接建構容器內的物件。這消除了創建臨時物件的需要以及不必要的複製的可能性。
何時使用 Emplace_backstd::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 在建立臨時物件會產生重大損失的情況下特別有用開銷。例如,將複雜物件插入標準映射時:
MSVC 的部分實現儘管為右值引用引入了非標準emplace_back 重載,MSVC尚未實現完整的可變版本。背後的原因是當時 Visual C 10 中缺乏可變參數範本支援。以上是Push_back 與 Emplace_back:什麼時候應該在 C 中使用它們?的詳細內容。更多資訊請關注PHP中文網其他相關文章!