push_back과 emplace_back 차이점

Subin·2024년 8월 16일

Algorithm

목록 보기
20/69

push_backemplace_back은 C++의 std::vector, std::deque, std::list와 같은 컨테이너에서 요소를 추가할 때 사용하는 메서드이다. 두 메서드는 비슷한 역할을 하지만, 작동 방식에 차이가 있다.

1. push_back

  • 역할: push_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_backstr을 복사해서 벡터에 추가한다. push_back은 복사 생성자 또는 이동 생성자를 사용해 객체를 추가한다.

2. emplace_back

  • 역할: emplace_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"라는 문자열을 벡터 내부에서 직접 생성한다. 복사나 이동이 필요 없으므로 불필요한 연산이 줄어든다.

3. 요약: 차이점

  • 복사/이동 유무: push_back은 객체를 복사하거나 이동해서 추가하지만, emplace_back은 객체를 직접 컨테이너 내부에서 생성한다.
  • 사용 용도: 이미 존재하는 객체를 추가할 때는 push_back을 사용하고, 객체를 직접 컨테이너 내에서 생성할 때는 emplace_back을 사용하는 것이 좋다.
  • 성능: emplace_back은 복사나 이동이 생략되므로 성능 측면에서 더 효율적일 수 있다. 특히 복사/이동 생성이 비용이 많이 드는 경우에 유리하다.

4. 실용적인 예시

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: 객체를 직접 컨테이너 내에서 생성할 때 사용. 객체의 복사나 이동이 필요 없으며, 성능 최적화에 유리.
profile
성장하며 꿈꾸는 삶을 살아가고 있는 대학생입니다😊

0개의 댓글