C++ STL 컨테이너에 요소를 삽입할 때 emplace()와 insert() 두 가지 방법을 사용할 수 있습니다. 두 함수의 가장 큰 차이점은 객체 생성 방식에 있습니다.
emplace()와 insert()의 핵심 차이
emplace()는 객체를 미리 생성한 후 복사하는 대신, 컨테이너 내부에서 직접 객체를 생성(in-place construction)합니다. 이 과정에서 불필요한 객체 복사나 이동 연산을 피할 수 있기 때문에, insert()보다 더 효율적으로 삽입 작업을 수행합니다.
반면 insert()는 이미 생성된 객체에 대한 참조(reference)를 인자로 받아, 해당 객체를 컨테이너로 복사하거나 이동시키는 방식으로 동작합니다. 따라서 임시 객체가 한 번 더 생성되는 오버헤드가 발생할 수 있습니다.
알고리즘
시작 set 컨테이너를 선언한다. emplace()를 사용하여 pair를 삽입한다. insert()를 사용하여 make_pair로 pair를 삽입한다. set의 내용을 출력한다. 종료
예제 코드
아래 예제는 set<pair<int, char>> 컨테이너에 emplace()와 insert()를 각각 사용해 요소를 삽입하고 결과를 출력합니다.
#include<bits/stdc++.h>
using namespace std;
int main() {
set<pair<int, char>> s;
s.emplace(7, 'a');
s.insert(make_pair(6, 'b'));
for (auto it = s.begin(); it != s.end(); ++it)
cout << " " << (*it).first << " " << (*it).second << endl;
return 0;
}실행 결과
7 a 6 b
정리
두 함수 모두 set에 pair를 성공적으로 삽입하지만, 내부 동작 방식은 다릅니다. emplace(7, 'a')는 인자들을 그대로 전달해 set 내부에서 pair를 직접 생성하는 반면, insert(make_pair(6, 'b'))는 먼저 임시 pair 객체를 만든 뒤 이를 set으로 복사·이동합니다. 따라서 성능이 중요한 상황에서는 불필요한 복사를 줄여주는 emplace()를 사용하는 것이 권장됩니다.