프로그래밍 연습장

C++11: emplace 본문

끄적끄적

C++11: emplace

김준원 2017. 10. 6. 00:18

방금 C++11에서 새로 추가된 emplace라는 함수를 처음 보았다!


C++의 선형 컨테이너들에 새로 들어간 멤버 함수인데, push 함수와와 기능적으로 거의 동일하다.


값을 만드는 생성자 인수를 전달해주면 "그 인수들로 새로 원소가 들어갈 장소에 바로 원소를 만든다"는 것이다. 즉, 들어갈 값(또는 struct)를 생성자로 생성한 다음에 그것을 복사해 새로 컨테이너에 넣는 메모리 낭비를 막아준다는 것이다.


다시 말하면, 아래 두 쌍의 코드들은 과정은 다르겠지만 완전히 같은 결과를 불러온다.

1
2
3
4
5
6
7
8
9
10
11
12
#include <bits/stdc++.h>
using namespace std;
 
queue<int> q;
 
int main()
{
    for (int i=0; i<5; i++) {
        q.push(i);
    }
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
#include <bits/stdc++.h>
using namespace std;
 
queue<int> q;
 
int main()
{
    for (int i=0; i<5; i++) {
        q.emplace(i);
    }
}
 
cs

(정수 등의 기본 데이터 타입은 그 자신을 생성자의 인수로 생성할 수 있다. int(3) 등이 가능하다는 것이다)
그리고
1
2
3
4
5
6
7
8
9
10
11
12
#include <bits/stdc++.h>
using namespace std;
 
queue<pair<intint> > q;
 
int main()
{
    for (int i=0; i<5; i++) {
        q.push(pair<intint>(-i, i));
    }
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
#include <bits/stdc++.h>
using namespace std;
 
queue<pair<intint> > q;
 
int main()
{
    for (int i=0; i<5; i++) {
        q.emplace(-i, i);
    }
}
 
cs



로 완전히 대체되어 쓰일 수 있다.


혹시나 해서 속도 실험을 해 보았지만 두 함수의 속도는 어떤 경우에도 비슷하다. int형의 경우는 emplace가 3%정도 빨랐고, pair나 tuple 등에서는 거의 차이가 나지 않았다. 글자수가 적은 push가 더 우월한 듯하다.


하지만, 다익스트라 등을 짤 때 emplace를 사용한 코드는 조금 더 깔끔해질 것 같다.


참고로, vector나 deque 등에서는 emplace_back, (deque는) emplace_front 등도 정의되어 있다!

'끄적끄적' 카테고리의 다른 글

20200803 PS  (0) 2020.08.10
UCPC 2020 후기  (0) 2020.08.02
APIO 2018 후기  (2) 2018.05.24
C++11: emplace  (1) 2017.10.06
Tag
, ,
1 Comments
  • 프로필사진 ㅇㅇ 2020.01.09 02:54 객체를 직접 담는경우 emplace_back()이 더 낫습니다. 그 이유는 emplace_back()은 삽입할 객체의 생성자를 위한 인자들을 받아 std::vector 내에서 직접 객체를 생성하여 삽입하므로 임시 객체의 생성과 파괴, 복사(혹은 move)를 하지 않아도 되기 때문입니다.
댓글쓰기 폼