공부/C++

Vector push_back과 emplace_back의 차이

셩잇님 2022. 12. 16. 14:16
반응형

 

 

push_back은 벡터의 끝에 인자 값을 추가하는 vector 클래스의 함수입니다. 이 때 push_back은 추가할 인자 값은 현재 위치에서 값을 복사하거나 이동하여 벡터에 추가됩니다.

 

std::vector<int> v;
int x = 1;
v.push_back(x);  // v 벡터에서 이제 [1]을 포함합니다

위 예에서 push_back은 인자 값 x를 복사하여 벡터의 끝에 추가합니다. 즉, 인자 값(1)의 새로운 복사본이 생성되어 벡터에 추가되고 원래 요소인 x는 변경되지 않은 상태로 유지됩니다.

 


 

반면에 emplace_back 또한 벡터에 끝에 인자 값을 추가하는 vector 클래스의 함수이지만, 기존 값들을 복사하거나 이동하는 연산을 하지 않고, 제자리에서 인자값을 구성하여 생성합니다. 이로 인해 인자 값을 복사하거나 이동하는 데 프로세스의 처리 비용이 들지 않아 push_back 보다 효울적입니다.

 

std::vector<std::string> v;
v.emplace_back("Hello");  // v 벡터에서 이제 [Hello]를 포함합니다

위 예에서 emplace_back은 문자열 'Hello'를 제자리에서 구성하여 벡터의 끝에 새 인자 값을 추가합니다. 즉, 기존에 있던 값들을 복사하거나 이동할 필요 없이 새로운 인자 값이 벡터 내부에 직접 생성됩니다. 아울러 emplace_back은 추가할 새로운 인자 값을 생성자에서 전달하여 원하는 값을 가질 수 있어 사용자가 원하는 형식으로 인자 값을 넣어줄 수 있습니다.

 

std::vector<std::pair<int, int>> v;
v.emplace_back(1, 2);  // v 벡터에서 이제 [(1, 2)]의 값을 가집니다.

위 예에서 emplace_back은 int형 정수 1과 2를 사용하여 제자리에서 구성후 벡터의 끝에 새로운 인자 값을 추가합니다.

 


 

결론 :

push_back은 삽입할 객체를 임시 객체로 만들어 push_back 함수 내부에서 복사를 한 후 vector에 이동하여 추가하고,

emplace_back은 삽입할 객체를 생성자에서 인자로 받아 vector 내부에서 직접 객체를 생성&삽입하여 push_back에서 일어나는 복사, 이동하지 않아도 되어 성능상 유리하다.

 

보다 자세한 내용은 및 출처 : https://blog.naver.com/sorkelf/220825930008

 

std::vector embrace_back 과 push_back의 차이 (The difference between emplace_back and push_back in a std::vector container)

emplace_back 과 push_back의 차이를 알아 보기 이전에 L-Rvalue라는 개념을 알아야 한다. Before under...

blog.naver.com

 

 

 

반응형