[C++] Vector emplace_back 과 push_back
by pmj6541흔히들 리스트, 벡터, 어레이 등등 가변길이 배열에 항목을 추가하고자 add, push, append 등을 사용하죠. (이건 왜이렇게 다양한지 참)
이제까지는 사실 add 하면 추가가 되니 add 쓰고, append 해도 잘 작동하니 쓰고, 라는 생각을 했었는데, 하나하나 따져보고 내부 동작 원리를 파악한 다음 써보려고 합니다.
Vector 에서 사용하는 함수
push_front, push_back, emplace_front, emplace_back 정도 생각해보죠. 위에서 말한 키워드 외 emplace 라는게 또 추가됐네 ㅎ
하나하나 봅시다.
각자 공식 문서 reference를 달아놓고, 파훼쳐봅시다.
push_back
https://en.cppreference.com/w/cpp/container/vector/push_back
std::vector<T,Allocator>::push_back - cppreference.com
void push_back( const T& value ); (1) (constexpr since C++20) void push_back( T&& value ); (2) (since C++11) (constexpr since C++20) Appends the given element value to the end of the container. 1) The new element is initialized as a copy of value. 2) value
en.cppreference.com
간단하게 설명하고 이해해야 머리에 잘 들어오니 한문장으로 표현하자면,
L-value 의 경우 " 객체 복제 후 원소 추가 " / R-value 의 경우 " 객체 포인터 값 원소 추가 "
emplace_back
https://en.cppreference.com/w/cpp/container/vector/emplace_back
std::vector<T,Allocator>::emplace_back - cppreference.com
template< class... Args > void emplace_back( Args&&... args ); (since C++11) (until C++17) template< class... Args > reference emplace_back( Args&&... args ); (since C++17) (constexpr since C++20) Appends a new element to the end of the container. The elem
en.cppreference.com
여기도 L, R-value 모드 받을 수 있으며, push_back 에서는 "복제 후 생성", 포인터 값 추가" 등의 오리지널 객체를 따로 보았었다면 emplace_back 에서는 오리지널 객체 자체가 새로 추가하게될 객체가 된다. 설명이 조금 장황한데, 이로인해 파생되는 효과로 이해한다면, " 복사 및 이동 작업을 피한다" 가 된다. (객체 내 바로생성)
또하나. C++17 이 되면서 함수 자체 리턴 타입이 reference 가 되어 삽입한 객체를 반환된다.
무조건 emplace_back 이 좋냐?
성능은 emplace_back 이 좋아요. 하지만 하나 더 짚고 넘아가야 할 점.
push_back 과 emplace_back 의 형태를 보면 각자 T&& / Args&& 이죠.
vector 의 T 가 간단한 형(int, string 등) 이라면 상관 없겠지만, 새로 생성한 class 이거나, 2차원 등의 벡터일 경우, 컴파일러가 Args 항목에 다른 항목이 들어가면 문제가 발생합니다. 당연한 사실 이지만 꼭 알아두도록.
결론지어줘요.
성능이 중요한 코테, 백준 등에선 emplace_back을 주로 쓰시고, 협업, 개발 현업 등에서는 emplace_back 쓸때 우려되는 점 정도는 생각하고 써라. 입니다.
'C++' 카테고리의 다른 글
[C++/Server] 단일 클라이언트 구현 - 클라이언트 (0) | 2025.06.10 |
---|---|
[C++/Server] 단일 클라이언트 통신 구현 - 서버 (1) | 2025.06.10 |
[C++] Dynamic Array 주의사항 (1) | 2024.11.27 |
[C++] Vector를 사용할때 Capacity 가 중요한 이유 (2) | 2024.11.26 |
[C++] 왜 하세요? (2) | 2024.11.26 |
블로그의 정보
만두네민박
pmj6541