2013-07-27 161 views
1

我知道容器上的emplace功能的一般概念(「構建新的元素inplace」)。
我的問題不是它的作用, 但更像是有效的C++ 11之一。什麼時候使用emplace *以及何時使用push/insert

什麼是決定何時使用(例如,用於當談到std::vectoremplace_back()以及何時使用push_back()和一般佈設*與「舊」的插入功能良好的規則?

+0

在非可複製類型上使用'emplace'。 – Rapptz

+0

@Rapptz如果它是不可複製但可移動的,又名unique_ptr? – NoSenseEtAl

+1

我的第一個想法是_always_ use'emplace'。我不能馬上想到使用'push_back'的理由。我必須忘記一些東西 –

回答

2

emplace_back()只有在您將其放入容器之前必須從頭開始構建對象時纔有意義。如果您將它預先構建的對象交給它,它基本上會降解爲push_back()。如果對象拷貝的成本很高,或者你必須在一個緊密的循環中創建很多對象,你將會看到差異。

我傾向於將以下代碼:

myvector.push_back(ContainedObject(hrmpf)); 

myvector.emplace_back(hrmpf); 

如果前者顯示了事件探查器輸出。對於新代碼,如果可以的話我可能會使用emplace_back(我們仍然主要是VS2010在工作,其實現emplace_back()有點困難)。

+0

爲什麼說emplace_back在其他情況下沒有意義? –

+0

@MooingDuck因爲'push_back'已經在右值引用上被重載了,所以如果你已經有了一個對象,你可以將它移動到vector中,而不是就地構造它,因爲'emplace_back'將 – TemplateRex

+0

@TemplateRex:啊,你說它沒有意義,因爲我們已經有了'push_back'。我會反過來辯論,'emplace_back' _always_有道理,'push_back'已被棄用。 –

相關問題