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
'💻 > C++' 카테고리의 다른 글
[c++] replace() 함수, find() 함수 / 문자열 찾기 (2) | 2024.11.27 |
---|---|
[c++] 구조체 백터 푸시백 , 순서쌍 넣기 /struct vector push_back (2) | 2024.07.13 |
[c++] 반올림 / 올림 / 내림 함수 (0) | 2024.04.11 |
[c++] DFS 깊이 우선 탐색 , 재귀함수 (0) | 2024.04.02 |
[c++] DAT (0) | 2024.03.21 |