Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ STL에서 emplace()와 insert()의 차이점 완벽 비교

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()를 사용하는 것이 권장됩니다.