본문 바로가기
C,C++/정보정리

[C/C++] Vector 함수(push_back, emplace_back)

by 마두식 2022. 10. 5.
반응형

우선, push_back이나 emplace_back이나 모두 Vector의 마지막에 새로운 원소를 추가하기 위해 사용하는 함수이다.

하지만 완전히 같은 기능을 한다면 굳이 다른 이름의 함수가 2개나 있을 필요는 없었을테니 차이가 무엇인지 지금부터 알아보도록 하자.

 

push_back

push_back의 경우 Vector의 마지막에 새로운 원소를 추가하기 위해 임시 객체를 하나 만들어서 거기에 값을 복사 후, Vector에 삽입하는 과정을 거친다. 삽입이 끝나면 당연히 임시 객체 또한 파괴된다.

 

임시 객체를 생성한다는 것은 즉, 잠깐 쓰고 버릴 메모리를 굳이 할당해줘야 한다는 뜻이다. 또한, 임시 객체를 생성하고 파괴하는 과정에서 생성자와 소멸자가 호출되어 불필요한 연산이 생긴다.

 

1
2
vector<vector<int>> vec;
vec.push_back(5);
cs

또한, push_back 함수의 경우 위와 같은 코드는 사용이 불가능하다. 메모리 할당은 push_back 함수를 이용해서 할 수 없다.

 

1
2
vector<vector<int>> vec;
vec.push_back({13});
cs

대신, push_back 함수를 사용할 경우 위와 같이 2차원 배열의 인자 값으로 배열 자체를 넣어주는 사용이 가능하다.

 

 

emplace_back

emplace_back은 가변인자 템플릿을 사용해서 삽입하려는 자료형에 따라, 함수 내에서 삽입을 위한 객체를 자체적으로 생성할 수 있다. 즉, 불필요한 임시 객체를 만들 필요가 없다.

 

그에 따라 불필요한 메모리 할당도 없으며, 생성자 소멸자를 호출하는 등의 연산 또한 필요가 없다.

 

 

1
2
vector<vector<int>> vec;
vec.emplace_back(5);
cs

또한, emplace_back 함수의 경우 위와 같은 코드의 사용도 가능하다. emplace_back 함수의 경우 메모리 할당 또한 가능한 것이다.

 

1
2
vector<vector<int>> vec;
vec.emplace_back({1,3});
cs

대신, 위와 같이 2차원 배열의 인자 값으로 배열 자체를 넣어주는 사용은 불가능하다.

 

 

결론

효율성의 즉면에서 보면 emplace_back 이 push_back 보다 좋아보인다.

하지만 그렇다고 해서 emplace_back이 완전히 push_back을 대신할 수 있는 것은 아니다.

 

1. 먼저 위에서 보았던 2차원 배열의 인자 값으로 배열 자체를 넣어주는 사용이 필요할 때, emplace_back 사용이 불가능하다는 것.

 

1
2
vec.push_back(5);
vec.emplace_back(5);
cs

2. 위와 같은 코드만 보았을 때, emplace_back은 Vector의 마지막 요소에 5를 삽입하는 것인지, 2차원 배열의 메모리를 할당하는 것인지 알 수 없다.

 

 

위의 2가지 경우를 고려했을 때, 다른 사람들과 함께 하는 프로젝트이거나, 개인 프로젝트이더라도 장기 프로젝트라면 emplace_back을 사용했을 경우 문제가 발생할 수 있다.

따라서 그런 경우라면 명시적인 타입의 push_back을 써서 호환성을 높이고 코드를 안전하게 작성하는 것이 오히려 좋을 수도 있다.

 

반대로, 간단한 개인 프로젝트이거나 코딩테스트용 알고리즘 문제 풀이 등을 위한 것이라면 emplace_back을 쓰는 것 또한 좋은 선택지가 될 수 있다.

 

 

 


 

 

틀린 부분이나 이상한 부분이 있으면 댓글로 편하게 지적해주세요!

감사합니다!

 

 

참고 링크

[C++] std::vector push_back vs emplace_back 차이점 (tistory.com)

push_back vs. emplace_back | Devlog (ralpioxxcs.github.io)

 

반응형

'C,C++ > 정보정리' 카테고리의 다른 글

[C/C++] Reference(참조)  (0) 2022.10.11
[C/C++] Vector.clear() 함수  (0) 2022.10.05
[C/C++] 가상함수  (0) 2022.09.30
[C/C++] 파일 입출력 함수 정리  (0) 2022.09.27
[C/C++] _getch() 함수  (0) 2022.09.23

댓글