본문 바로가기
프로그래밍/C++

emplace() vs emplace_back()의 차이점 알아보기

by bantomak 2025. 12. 22.
반응형

두 함수의 공통점

std::vector를 사용할 때 매번 헷갈렸던 두 함수에 대해서 명확하게 정리하고 가보자. 우선 두 함수의 공통점을 알아보자.

  • 컨테이너에 요소를 추가하는 함수
  • 객체를 내부에서 직접 생성(in-place construction)한다. 즉, 추가시 임시 객체를 생성하지 않는다.

emplace()

  • 삽입 위치를 사용자가 직접 지정
  • 매개변수로 반복자(Iterator)와 생성자 인자를 받는다.
  • 반환값으로 생성된 요소의 반복자를 반환한다.
  • std::vector의 경우는 삽입 위치에 따라서 O(n)의 성능

emplace_back()

  • 이름처럼 컨테이너 맨 끝(end())에 삽입
  • 매개변수로 생성자 인자를 받는다.
  • 반환값은 void
  • O(1)의 성능

emplace_front()

  • 이름처럼 컨테이너 맨 앞(begin())에 삽입
  • 매개변수로 생성자 인자를 받는다.
  • 반환값은 void
  • O(1)의 성능

back() 또는 front()등 위치가 이미 지정된 함수들의 경우에는 O(1)의 성능을 보장한다는 설계의도가 담겨져있다.

사용 예제

  • emplace_back()은 별도의 위치를 지정하지 않아도 맨 뒤에 요소가 추가된다. 간단하고 매우 효율적
  • emplace()는 사용 시 삽입 위치에 따라서 맨 앞에 추가 시 모든 요소들이 전부 이동시켜야 할 수 있다. (비용 발생)
// emplace()
std::vector<int> v = {1, 2, 4};
auto it = v.begin() + 2; 
v.emplace(it, 3); // 2번 인덱스 위치에 3을 생성. [1, 2, 3, 4]가 됨.

// emplace_back()
std::vector<int> v = {1, 2, 3};
v.emplace_back(4); // [1, 2, 3, 4]

정리하자면

  • emplace()은 삽입 위치를 지정해줘야 한다.
  • emplace_back()맨 뒤에 요소를 추가한다. 간결하고 효율적이다.
  • v.emplace(v.begin, args..)와 같이 맨 앞에 요소를 추가하면 성능상으로 이슈가 발생할 여지가 있어서 std::vector 대신 std::deque나 std::list를 사용을 고려해야 한다.
  • std::vector 사용시에는 웬만하면 emplace_back()을 사용하자.

같이 읽으면 좋은 글

 

C++ push_back()과 emplace_back() 차이

push_back() 이미 만들어진 객체를 복사 또는 이동해서 추가push_back은 이미 생성된 객체를 추가할 때 사용한다.내부적으로 복사 생성자 혹은 이동 생성자가 호출된다.std::vector v;std::string s = "Hello";v.p

jettstream.tistory.com

댓글