Tiny Bunny
본문 바로가기
💻/C++

[c++] vector push_back과 emplace_back

by soonybutter 2024. 6. 27.
728x90

 
 

1. push_back과 emplace_back의 차이

 

 

 push_back과 emplace_back은 vector안에 객체를 넣는 방식에 차이가 있다.

 push_back() 함수는 객체를 집어넣는 형식이다.

 

 따라서 객체가 없는 상황이라면 '임시 객체'가 있어야한다.

 이미 만들어진 객체를 넣는 함수인 것이다. 이때 인자는 v의 끝에 계속해서 추가된다.

vector<int>v;

for (int i = 0; i < 5; i++)
{
	int a;
	cin >> a;

	v.push_back(a);
}

//v에 5개의 int형 인자를 받음.

 

 

반면에 emplace_back()함수의 경우, 

함수를 구성하는데 필요한 정보먼저 넣어주고 함수 내에서 객체를 생성해서 삽입하는 방식이다.

함수 내부에 임시객체가 생성돼서 자리를 잡아준다는 특징을 가진다.

 

따라서 emplace_back()을 사용하면 불필요한 메모리 할당이 필요없고, 불필요한 객체 생성을 줄일 수 있다.

 

 

 

예시 

 2차원 백터에 pushback하는 상황으로 가정하면,


case 1

vector<vector<int>>v;

for (int i = 0; i < 3; i++)
{
   vector<int>tmp;

   for (int k = 0; k < 3; k++)
   {
      int a;
      cin >> a;
      tmp.push_back(a);
   }

    v.push_back(tmp);
}

 
 
case 2

vector<vector<int>>v;

for (int i = 0; i < 3; i++)
{
   v.emplace_back();

   for (int k = 0; k < 3; k++)
   {
      int a;
      cin >> a;

      v[i].push_back(a);

      
   }
}

 
 
case 3

vector<vector<int>>v;

for (int i = 0; i < 3; i++)
{
   vector<int>tmp;

   v.push_back(tmp);

   for (int k = 0; k < 3; k++)
   {
      int a;
      cin >> a;

      v[i].push_back(a);

      
   }
}

 

 

 

2.  emplace_back  과  push_back

 

push_back
vector<vector<int>>v;
v.push_back(5);

 

push_back은 위의 코드가 사용 불가능하다.

(메모리 할당은 push_back함수를 이용해서 할 수 없기 때문이다.)

 

그러나 아래와 같이 2차원 배열의 인자값으로 배열을 통째로 넣어주는 것은 가능하다.

vector<vector<int>> vec;
vec.push_back({1,3});

 

 

 

empace_back
vector<vector<int>>v;
v.emplace_back(5);

emplace_back 함수는 위의 코드가 사용 가능하다.

 (메모리 할당도 가능하기 때문이다.)

 

 하지만 아래와 같이 2차원 배열을 통째로 넣어주는 것은 불가능하다.

vector<vector<int>> vec;
vec.emplace_back({1,3});

 

 

 

 

 

 

 

틀린 부분이나 이상한 부분이 있으면 댓글로 지적해주세요! 감사합니다 :)

 

728x90

TOP

Designed by 티스토리