push_back()與emplace_back()
vector<string> res;
res.push_back()
和 res.emplace_back()
在功能上類似,但它們之間有一些關鍵的區別。讓我們詳細比較一下它們:
1. push_back()
- 作用:將一個已經構造好的對象添加到容器的末尾。
-
語法:
res.push_back(value);
-
特點:
-
push_back()
會復制或移動一個現有對象到容器中。 - 必須先構造
value
對象,然后才能將其添加到容器中。
-
示例:
std::vector<std::string> res;
std::string s = "hello"; // 構造對象
res.push_back(s); // 復制 s 到 res 中
// 或者使用移動
res.push_back(std::move(s)); // 移動 s 到 res 中
2. emplace_back()
- 作用:直接在容器的末尾原地構造對象。
-
語法:
res.emplace_back(args...);
-
特點:
-
emplace_back()
通過傳遞構造函數的參數,直接在容器末尾構造對象,避免了不必要的臨時對象和拷貝。 - 更高效,尤其是在對象的構造和拷貝成本較高時(如復雜類對象)。
-
示例:
std::vector<std::string> res;
res.emplace_back("hello"); // 直接在容器中構造一個 std::string 對象
主要區別:
區別 | push_back() | emplace_back() |
---|---|---|
對象構造 | 需要一個已構造的對象進行復制或移動。 | 直接在容器內構造對象,避免臨時對象。 |
性能 | 可能涉及一次或多次拷貝/移動操作。 | 通常更高效,避免了不必要的拷貝或移動。 |
使用場景 | 已有對象或簡單對象。 | 構造復雜對象或需要傳遞構造函數參數時。 |
總結:
- 如果你已經有一個對象實例并想將它添加到容器中,使用
push_back()
。 - 如果你想直接在容器中構造對象,避免拷貝或移動,使用
emplace_back()
。
在現代 C++ 編程中,如果需要構造對象,通常推薦使用 emplace_back()
,因為它可以提高性能并簡化代碼。
允許的
vector<string> res;
res.push_back();
res.push_back("hello");
區別 push_back("hello") emplace_back("hello")
操作 隱式構造 std::string,然后移動或復制。 直接在容器中構造 std::string。
性能 可能涉及一次構造和一次移動操作。 通常更高效,避免額外的移動。
推薦場景 已經有現成的 std::string 對象。 直接使用構造參數構造對象。