IT/Programming

[C++] push_back() 과 emplace_back() 의 차이점 정리

Uncle D. 2023. 4. 24. 23:08
반응형

 

C++ STL의 Vector는 동적으로 크기가 조정되는 배열로, 데이터를 추가하거나 삭제할 때 사용됩니다.

vector에 데이터를 추가하는 두 가지 일반적인 방법은 push_back()과 emplace_back()입니다.

emplace_back() 이 더 효율적이라고 하는데, 이 두 함수의 차이점을 포스팅하려고 합니다.

 

1. push_back()

push_back()은 vector에 새로운 요소를 추가할 때, vector의 끝에 새로운 요소를 추가하며, 새로운 요소를 추가하기 위해 복사(constructor) 또는 이동(move) 연산자가 호출됩니다.

즉, 새로운 요소를 생성한 다음, 기존의 요소들을 이동시키기 때문에 삽입할 데이터 타입에 대한 복사 생성자 또는 이동 생성자가 필요합니다.

 

예를 들어, 다음과 같이 vector에 int형 변수를 추가하는 코드를 작성할 수 있습니다.

#include <vector>

int main() {
    std::vector<int> v;

    // push_back() 함수로 int형 변수 추가하기
    v.push_back(1);

    return 0;
}

 

2. emplace_back()

emplace_back() 함수는 vector에 새로운 원소를 추가할 때, 인수로 전달된 값을 사용하여 생성자를 호출합니다. push_back() 함수와 달리 생성자를 호출하여 객체를 직접 생성합니다.

 

push_back()은 임시 객체를 생성하고 이동/복사 시킨후, 임시 객체를 소멸 시키는 과정(비용↑)이 필요하지만,

emplace_back()은 객체 생성에 필요한 인수를 직접 전달하기 때문에,  push_back()보다 더 효율적입니다.

 

예를 들어, 다음과 같은 Person 클래스가 있다고 가정해봅시다.

Person 클래스는 이름과 나이를 가진 사람을 나타내는 클래스입니다.

class Person {
public:
    Person(std::string name, int age) : name_(name), age_(age) {}
private:
    std::string name_;
    int age_;
};

 이제 이 클래스를 사용하여 vector에 요소를 추가하는 방법을 살펴보겠습니다.

std::vector<Person> persons;

// push_back() 함수를 사용하여 Person 객체를 추가하는 경우
persons.push_back(Person("Alice", 25));

// emplace_back() 함수를 사용하여 Person 객체를 추가하는 경우
persons.emplace_back("Bob", 30);

위의 코드에서는,

push_back() 함수는 Person 객체를 생성하여 객체를 전달하지만,

emplace_back() 함수를 사용하는 경우에는 Person 객체를 생성하기 위한 인수를 직접 전달합니다.

이를 통해 복사 생성자를 호출하는 대신, 객체 생성에 필요한 인수를 전달하므로, 효율성을 높일 수 있습니다.

지금까지 push_back()과 emplace_back() 의 차이점을 살펴보았습니다.

반응형