반응형
두 함수의 공통점
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
'프로그래밍 > C++' 카테고리의 다른 글
| C++ 스마트 포인터 unique_ptr에 대해서 알아보자 (0) | 2026.01.02 |
|---|---|
| C++ Erase-remove 관용구란 무엇인가? (0) | 2025.12.28 |
| C++ emplace_back()을 무조건 권장하지 않는 이유는? (0) | 2025.12.22 |
| C++ 기본 타입은 왜 std::move()로 이동되지 않는가? (0) | 2025.12.20 |
| C++ std::list erase() 사용시 연결은 왜 끊기지 않을까? (0) | 2025.12.07 |
댓글