push_back과 emplace_back은 C++의 std::vector, std::deque, std::list와 같은 컨테이너에서 요소를 추가할 때 사용하는 메서드이다. 두 메서드는 비슷한 역할을 하지만, 작동 방식에 차이가 있다.
push_backpush_back은 컨테이너의 끝에 요소를 추가한다.push_back은 이미 만들어진 객체를 컨테이너에 복사하거나 이동한다.예를 들어, std::vector에 객체를 추가할 때, push_back은 다음과 같이 동작한다:
#include <vector>
#include <string>
int main() {
std::vector<std::string> vec;
std::string str = "Hello";
vec.push_back(str); // str 객체를 복사하여 vec에 추가
vec.push_back("World"); // "World"라는 임시 객체를 만들어 vec에 추가
}
위 코드에서 push_back은 str을 복사해서 벡터에 추가한다. push_back은 복사 생성자 또는 이동 생성자를 사용해 객체를 추가한다.
emplace_backemplace_back은 컨테이너의 끝에 요소를 추가한다.emplace_back은 요소를 컨테이너에 직접 생성한다. 이때 객체의 복사나 이동 없이 컨테이너 내부에서 객체가 직접 생성된다.예를 들어, std::vector에 객체를 추가할 때, emplace_back은 다음과 같이 동작한다:
#include <vector>
#include <string>
int main() {
std::vector<std::string> vec;
vec.emplace_back("Hello"); // "Hello"라는 문자열을 직접 vec 내부에서 생성
vec.emplace_back(5, 'a'); // 'a'로 초기화된 길이 5의 문자열을 vec 내부에서 생성
}
위 코드에서 emplace_back은 "Hello"라는 문자열을 벡터 내부에서 직접 생성한다. 복사나 이동이 필요 없으므로 불필요한 연산이 줄어든다.
push_back은 객체를 복사하거나 이동해서 추가하지만, emplace_back은 객체를 직접 컨테이너 내부에서 생성한다.push_back을 사용하고, 객체를 직접 컨테이너 내에서 생성할 때는 emplace_back을 사용하는 것이 좋다.emplace_back은 복사나 이동이 생략되므로 성능 측면에서 더 효율적일 수 있다. 특히 복사/이동 생성이 비용이 많이 드는 경우에 유리하다.push_back은 다음과 같이 동작한다:
#include <vector>
#include <string>
int main() {
std::vector<std::string> vec;
std::string str = "Hello";
vec.push_back(str); // 복사
vec.push_back(std::move(str)); // 이동
}
emplace_back은 다음과 같이 동작한다:
#include <vector>
#include <string>
int main() {
std::vector<std::string> vec;
vec.emplace_back("Hello"); // 직접 생성
vec.emplace_back(5, 'a'); // "aaaaa"라는 문자열을 직접 생성
}
push_back: 이미 존재하는 객체를 추가할 때 사용. 객체의 복사나 이동이 필요함.emplace_back: 객체를 직접 컨테이너 내에서 생성할 때 사용. 객체의 복사나 이동이 필요 없으며, 성능 최적화에 유리.