push_back()與emplace_back()
vector<string> res;
res.push_back()
和 res.emplace_back()
在功能上類(lèi)似,但它們之間有一些關(guān)鍵的區(qū)別凶硅。讓我們?cè)敿?xì)比較一下它們:
1. push_back()
- 作用:將一個(gè)已經(jīng)構(gòu)造好的對(duì)象添加到容器的末尾拷呆。
-
語(yǔ)法:
res.push_back(value);
-
特點(diǎn):
-
push_back()
會(huì)復(fù)制或移動(dòng)一個(gè)現(xiàn)有對(duì)象到容器中鲫寄。 - 必須先構(gòu)造
value
對(duì)象,然后才能將其添加到容器中。
-
示例:
std::vector<std::string> res;
std::string s = "hello"; // 構(gòu)造對(duì)象
res.push_back(s); // 復(fù)制 s 到 res 中
// 或者使用移動(dòng)
res.push_back(std::move(s)); // 移動(dòng) s 到 res 中
2. emplace_back()
- 作用:直接在容器的末尾原地構(gòu)造對(duì)象叁扫。
-
語(yǔ)法:
res.emplace_back(args...);
-
特點(diǎn):
-
emplace_back()
通過(guò)傳遞構(gòu)造函數(shù)的參數(shù),直接在容器末尾構(gòu)造對(duì)象畜埋,避免了不必要的臨時(shí)對(duì)象和拷貝莫绣。 - 更高效,尤其是在對(duì)象的構(gòu)造和拷貝成本較高時(shí)(如復(fù)雜類(lèi)對(duì)象)由捎。
-
示例:
std::vector<std::string> res;
res.emplace_back("hello"); // 直接在容器中構(gòu)造一個(gè) std::string 對(duì)象
主要區(qū)別:
區(qū)別 | push_back() | emplace_back() |
---|---|---|
對(duì)象構(gòu)造 | 需要一個(gè)已構(gòu)造的對(duì)象進(jìn)行復(fù)制或移動(dòng)兔综。 | 直接在容器內(nèi)構(gòu)造對(duì)象,避免臨時(shí)對(duì)象狞玛。 |
性能 | 可能涉及一次或多次拷貝/移動(dòng)操作软驰。 | 通常更高效,避免了不必要的拷貝或移動(dòng)心肪。 |
使用場(chǎng)景 | 已有對(duì)象或簡(jiǎn)單對(duì)象锭亏。 | 構(gòu)造復(fù)雜對(duì)象或需要傳遞構(gòu)造函數(shù)參數(shù)時(shí)。 |
總結(jié):
- 如果你已經(jīng)有一個(gè)對(duì)象實(shí)例并想將它添加到容器中硬鞍,使用
push_back()
慧瘤。 - 如果你想直接在容器中構(gòu)造對(duì)象,避免拷貝或移動(dòng)固该,使用
emplace_back()
锅减。
在現(xiàn)代 C++ 編程中,如果需要構(gòu)造對(duì)象伐坏,通常推薦使用 emplace_back()
怔匣,因?yàn)樗梢蕴岣咝阅懿⒑?jiǎn)化代碼。
允許的
vector<string> res;
res.push_back();
res.push_back("hello");
區(qū)別 push_back("hello") emplace_back("hello")
操作 隱式構(gòu)造 std::string桦沉,然后移動(dòng)或復(fù)制每瞒。 直接在容器中構(gòu)造 std::string金闽。
性能 可能涉及一次構(gòu)造和一次移動(dòng)操作。 通常更高效剿骨,避免額外的移動(dòng)代芜。
推薦場(chǎng)景 已經(jīng)有現(xiàn)成的 std::string 對(duì)象。 直接使用構(gòu)造參數(shù)構(gòu)造對(duì)象浓利。