이 글에서는 C++ STL의 map::emplace() 함수가 어떻게 동작하는지, 그 문법과 실제 사용 예제까지 자세히 알아봅니다.
C++ STL에서 맵(Map)이란?
맵(map)은 연관 컨테이너(associative container)의 일종으로, 키(key)와 매핑된 값(mapped value)의 조합으로 이루어진 요소들을 특정 순서에 따라 저장할 수 있게 해주는 자료구조입니다. 맵 컨테이너의 데이터는 내부적으로 항상 연관된 키를 기준으로 자동 정렬되며, 저장된 값은 고유한 키를 통해서만 접근할 수 있습니다.
map::emplace()란 무엇인가?
map::emplace()는 <map> 헤더 파일에 정의된 함수로, 맵 컨테이너에 새로운 요소를 직접 생성하여 삽입하는 역할을 합니다.
emplace()는 삽입하려는 요소의 키가 고유할 때만 새 요소를 추가합니다. 즉, 같은 키를 가진 요소가 이미 컨테이너에 존재한다면 삽입은 이루어지지 않습니다. 기존 객체를 복사하거나 이동하여 넣는 insert()와 비슷하게 동작하지만, emplace()는 컨테이너 내부에서 요소를 곧바로 생성하기 때문에 불필요한 복사·이동 오버헤드를 줄일 수 있다는 장점이 있습니다.
요소가 성공적으로 삽입되면 컨테이너의 크기가 1만큼 증가합니다.
문법(Syntax)
map_name.emplace(Args&& args);
매개변수(Parameters)
이 함수는 아래의 매개변수를 받습니다.
args − 맵에 삽입(emplace)하고자 하는 인자 또는 값입니다.
반환값(Return Value)
삽입이 성공하면 새로 삽입된 요소를 가리키는 반복자(iterator)를 반환합니다. 삽입에 실패한 경우, 즉 동일한 키를 가진 요소가 이미 존재하는 경우에는 컨테이너에 이미 들어 있던 그 요소를 가리키는 반복자를 반환합니다.
입력 예시
map<char, int> newmap;
newmap.emplace('a', 1);
출력 결과
a
전체 예제 코드
#include <bits/stdc++.h>
using namespace std;
int main() {
map<int, int> TP_Map;
TP_Map.emplace(4, 50);
TP_Map.emplace(2, 30);
TP_Map.emplace(1, 10);
TP_Map.emplace(1, 20);
TP_Map.emplace(1, 30);
cout << "TP Map is : \n";
cout << "MAP_KEY\tMAP_ELEMENT\n";
for (auto i = TP_Map.begin(); i != TP_Map.end(); i++)
cout << i->first << "\t" << i->second << endl;
return 0;
}
실행 결과
TP Map is : MAP_KEY MAP_ELEMENT 1 10 2 30 4 50
위 예제에서 키 1에 대해 세 번의 emplace() 호출이 있었지만 실제로 삽입된 것은 처음의 (1, 10)뿐입니다. 이후의 (1, 20), (1, 30)은 같은 키가 이미 존재하기 때문에 무시됩니다. 또한 삽입 순서와 관계없이 결과가 키를 기준으로 오름차순 정렬되어 출력되는 것도 확인할 수 있습니다.