2017년 7월 14일 금요일

STL container.emplace ...

C++11의 컨테이너에 emplace 시리즈 메소드가 생겼다. 요놈들은 뭐하는 놈들일까? 일단 내가 전혀 뜻을 모르는 영어단어라 사전을 찾아보니, '설치하다'라고 나온다. 이게 뭐여...

형태도 얄딱꾸리하게 생긴 녀석이다.

template< class... Args > 
iterator emplace( const_iterator pos, Args&&... args );

이렇게 생긴 녀석인데, 하는 일은 insert나 push_back/push_front 랑 비슷하다. 컨테이너에 원소 하나를 추가하는 일을 한다.

다만 기존 insert/push 시리즈는 넣을 객체를 caller에서 예쁘게 만들어서 전달하는데 이 과정에서 의도치 않게 임시객체가 뿅~하고 만들어지고 사라지는 부하가 생길 수 있다.

반면, emplace는 노드에 추가할 때, 주어진 인자(위에서 args)를 이용하여 객체의 생성자를 호출한다. 따라서 임시객체를 만들지 않거나, 임시객체 생성횟수를 줄여준다.

어지간한 경우에 emplace류가 insert/push류보다 빠르다고는 되어 있는데, effective c++이나 modern c++에서 찾아봐야겠다. 뭔가 함정이 있을 것 같은 느낌이 있달까.

* Fundamental types(int, char, long ...)에게는 아무런 의미가 없다~