vector, queue, map 등등 emplace()라는 함수를 갖는 컨테이너들이 있는데, 각자에게 맞는 자료형으로 알아서 원소를 삽입해주는 함수이다.

vector<int> int_vector;
int_vector.push_back(1);
int_vector.emplace_back(1);
//1, 1

queue<pair<int,int>> pair_queue;
pair_queue.push(make_pair(1,2));
pair_queue.emplace(1,2);
//(1,2) (1,2)

map<int,int> dictionary;
dictionary.insert(make_pair(1,2));
dictionary.emplace(2,3);

dictionary.insert(make_pair(1,5));
dictionary.emplace(2,5);
//[1:2] [2:3]

push랑 기능상 큰 차이는 없어보이는데, emplace가 약간 빠를 수도 있다고 한다.

int_vector의 경우에는 가독성면에서 큰 차이가 없으나, pair_queue나 dictionary같은 경우에는 make_pair함수를 안써도 되기 때문에 확실히 더 간편하다. tuple은 안써보긴 했는데, tuple에도 동일하게 emplace를 적용할 수 있다.

그리고 push나 insert와 달리 이터레이터가 무효화되지 않는다고 한다.

단, 호환성이 다소 떨어지기 때문에 협업이 있는 프로젝트에서는 웬만해선 push나 insert를 사용하라고 한다.