我知道容器上的emplace功能的一般概念(「構建新的元素inplace」)。
我的問題不是它的作用, 但更像是有效的C++ 11之一。什麼時候使用emplace *以及何時使用push/insert
什麼是決定何時使用(例如,用於當談到std::vector
) emplace_back()
以及何時使用push_back()
和一般佈設*與「舊」的插入功能良好的規則?
我知道容器上的emplace功能的一般概念(「構建新的元素inplace」)。
我的問題不是它的作用, 但更像是有效的C++ 11之一。什麼時候使用emplace *以及何時使用push/insert
什麼是決定何時使用(例如,用於當談到std::vector
) emplace_back()
以及何時使用push_back()
和一般佈設*與「舊」的插入功能良好的規則?
emplace_back()
只有在您將其放入容器之前必須從頭開始構建對象時纔有意義。如果您將它預先構建的對象交給它,它基本上會降解爲push_back()
。如果對象拷貝的成本很高,或者你必須在一個緊密的循環中創建很多對象,你將會看到差異。
我傾向於將以下代碼:
myvector.push_back(ContainedObject(hrmpf));
與
myvector.emplace_back(hrmpf);
如果前者顯示了事件探查器輸出。對於新代碼,如果可以的話我可能會使用emplace_back
(我們仍然主要是VS2010在工作,其實現emplace_back()
有點困難)。
爲什麼說emplace_back在其他情況下沒有意義? –
@MooingDuck因爲'push_back'已經在右值引用上被重載了,所以如果你已經有了一個對象,你可以將它移動到vector中,而不是就地構造它,因爲'emplace_back'將 – TemplateRex
@TemplateRex:啊,你說它沒有意義,因爲我們已經有了'push_back'。我會反過來辯論,'emplace_back' _always_有道理,'push_back'已被棄用。 –
在非可複製類型上使用'emplace'。 – Rapptz
@Rapptz如果它是不可複製但可移動的,又名unique_ptr? – NoSenseEtAl
我的第一個想法是_always_ use'emplace'。我不能馬上想到使用'push_back'的理由。我必須忘記一些東西 –