2013-07-27 1 views
1

컨테이너에 emplace 함수에 대한 일반적인 개념을 알고 있습니다 ("새로운 요소 inplace"생성).
제 질문은 그것이 무엇이 아니라, 하지만 더 효과적인 C++ 11과 비슷합니다.emplace *와 언제 푸시/인서트를 사용해야 할 때

(이 std::vector에 올 때 예에 대한) emplace_back()를 사용하는 경우를 결정할 때 push_back()를 사용하는 방법과 "이전"삽입 기능에 대 일반에 갖다 두도록 *에서 좋은 규칙은 무엇입니까?

+0

복사 할 수없는 유형에는'emplace'를 사용하십시오. – Rapptz

+0

@Rapptz 복사가 불가능하지만 움직일 수 있다면 unique_ptr일까요? – NoSenseEtAl

+1

제 첫 생각은 항상'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'은 이미 rvalue 참조에 과부하가 걸려 있기 때문에 이미 객체가 있다면'emplace_back'처럼 내부에서 구성하지 않고 벡터로 이동할 수 있습니다 – TemplateRex

+0

@TemplateRex : Ah , 당신은 우리가 이미'push_back '을 가지고 있기 때문에 의미가 없다고 말하는 것입니다. 나는'emplace_back'_always_가 의미가 있으며,'push_back'이 더 이상 사용되지 않는다고 다른 말을 할 것입니다. –

관련 문제