반응형
push_back() 이미 만들어진 객체를 복사 또는 이동해서 추가
- push_back은 이미 생성된 객체를 추가할 때 사용한다.
- 내부적으로 복사 생성자 혹은 이동 생성자가 호출된다.
std::vector<std::string> v;
std::string s = "Hello";
v.push_back(s); // 복사 발생
v.push_back(std::move(s)); // 이동 발생 (C++11 이상)
v.push_back("World"); // 임시 객체 생성 후 이동
emplace_back() 그 자리에서 바로 생성(in-place construction)
- 전달된 인자를 사용해 생성자에서 바로 객체 생성, 새로 만드는 객체를 추가할 때 사용한다.
- 별도의 임시 객체를 만들지 않아서 불필요한 복사나 이동이 없음
- 성능적으로 더 효율적이다.
std::vector<std::string> v;
v.emplace_back("Hello"); // 직접 생성 (복사/이동 없음)
v.emplace_back(5, 'a'); // "aaaaa" 생성
std::vector<std::pair<int, int>>로 알아보는 실제 예시
- push_back() 사용시 std::make_pair() 메서드를 반드시 사용해야 함
- push_back()은 이미 생성된 객체를 추가하는 메서드이기 때문
- 하지만 emplace_back() 사용 시에는 std::make_pair()를 사용하지 않아도 추가 가능
std::vector<std::pair<int, int>> myVec;
myVec.push_back(std::make_pair(1, 2)); // push_back 사용시 std::make_pair 사용해야함
myVec.push_back(std::make_pair(3, 4));
myVec.push_back(std::make_pair(5, 6));
std::vector<std::pair<int, int>> myVec2;
myVec2.emplace_back(1, 2);
myVec2.emplace_back(3, 4);
myVec2.emplace_back(5, 6);
push_back() 의 내부 동작
--- push_back with make_pair ---
Constructed (1, 2)
Moved (1, 2)
make_pair를 통해서 임시 객체를 만들고 이동 생성자를 통해서 vector 내부에 추가된다.
emplace_back() 의 내부 동작
--- emplace_back ---
Constructed (3, 4)
별도의 임시 생성자 없이 생성자를 통해서 vector 내부에 추가된다.
정리하자면
push_back()과 emplace_back()이 어떻게 다른지 그리고 어떤 상황에서 쓰면 좋을지에 대해서 알아봤다.
- 완성된 객체나 변환 가능한 값을 추가한다면 push_back()
- 새로 값을 추가하고 싶다면 emplace_back()
- push_back()은 임시 객체와 이동/복사 생성자가 호출된다.
- emplace_back()은 생성자만 호출된다.
'프로그래밍 > C++' 카테고리의 다른 글
| 이동(move)이 더 효율적인데 emplace_back()은 왜 복사하는가? (0) | 2025.12.06 |
|---|---|
| C++ 표준 컨테이너는 언제나 깊은 복사를 한다. (0) | 2025.12.06 |
| C++ std::map, std::unordered_map 사용시 erase 단순화하기 (0) | 2025.09.22 |
| C++ unordered_map이란? (1) | 2025.07.06 |
| 비주얼 스튜디오 2022(Visual Studio 2022)에서 C++ 언어 표준 변경하기 (0) | 2025.07.01 |
댓글