이 글에서는 C++ STL에서 map::insert() 함수의 동작 방식, 문법 그리고 실제 예제를 통해 맵에 요소를 삽입하는 방법을 자세히 알아보겠습니다.
C++ STL의 맵(Map)이란?
맵(map)은 연관 컨테이너(associative container)로, 키(key)와 매핑된 값(mapped value)의 쌍으로 이루어진 요소들을 특정 순서에 따라 저장할 수 있도록 지원합니다. 맵 컨테이너 내부의 데이터는 항상 연관된 키를 기준으로 자동 정렬되며, 각 요소는 고유한 키를 통해서만 접근할 수 있습니다.
map::insert()란 무엇인가?
map::insert() 함수는 C++ STL에 내장된 함수로, <map> 헤더 파일에 정의되어 있습니다. insert()는 맵 컨테이너에 새로운 값을 삽입하는 데 사용되며, 삽입된 요소의 수만큼 컨테이너의 크기가 증가합니다.
맵 컨테이너의 키는 고유(unique)하기 때문에, 삽입 작업 시 해당 요소의 키가 이미 컨테이너에 존재하는지 먼저 확인합니다. 만약 동일한 키가 이미 있다면 그 요소는 삽입되지 않습니다.
또한 맵 컨테이너는 모든 요소를 키를 기준으로 오름차순으로 유지합니다. 따라서 요소를 삽입할 때마다 해당 요소는 자신의 키에 맞는 적절한 위치에 자동으로 배치됩니다.
문법(Syntax)
1. Map_name.insert({key& k, value_type& val});
또는
2. Map_name.insert(iterator& it, {key& k, value_type& val});
또는
3. Map_name.insert(iterator& position1, iterator& position2);
매개변수(Parameter)
이 함수는 다음과 같은 매개변수를 받습니다.
k − 요소와 연관된 키입니다. 함수는 해당 키가 이미 컨테이너에 존재하는지 검사하며, 존재한다면 요소를 삽입하지 않습니다.
val − 삽입할 값입니다.
it − 요소를 삽입할 위치를 지정하는 데 사용되는 반복자(iterator) 타입의 값입니다.
position1, position2 − 여러 요소를 한 번에 삽입할 때 사용하는 범위로, position1은 시작 위치, position2는 끝 위치를 나타냅니다.
반환값(Return Value)
이 함수는 맵 컨테이너에 새로 삽입된 요소를 가리키는 반복자(iterator)를 반환합니다.
참고로, 단일 요소를 삽입하는 첫 번째 형태의 insert()는 실제로 pair<iterator, bool>을 반환하며, pair의 두 번째 요소(bool)는 삽입이 성공했는지 여부를 나타냅니다. 이를 활용하면 중복 키로 인한 삽입 실패 여부를 손쉽게 확인할 수 있습니다.
예제
입력
map<char, int> newmap;
newmap['a'] = 1;
newmap['b'] = 2;
newmap['c'] = 3;
newmap.insert({'d', 50});
출력
a:1 b:2 c:3 d:50
예제 1: 기본적인 insert() 사용법
#include <bits/stdc++.h>
using namespace std;
int main() {
map<int, int> TP_Map;
TP_Map.insert({3, 50});
TP_Map.insert({2, 30});
TP_Map.insert({1, 10});
TP_Map.insert({4, 70});
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 3 50 4 70
위 예제에서 볼 수 있듯이, 요소를 삽입한 순서와 관계없이 출력 결과는 항상 키를 기준으로 오름차순으로 정렬되어 있습니다.
예제 2: 반복자를 이용한 insert()
#include <bits/stdc++.h>
using namespace std;
int main() {
map<int, int> TP_Map;
TP_Map.insert({3, 50});
TP_Map.insert({2, 30});
TP_Map.insert({1, 10});
TP_Map.insert({4, 70});
auto i = TP_Map.find(4);
TP_Map.insert(i, { 5, 80 });
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 3 50 4 70 5 80
두 번째 예제에서는 find() 함수로 얻은 반복자를 힌트(hint)로 전달하여 요소를 삽입했습니다. 힌트를 사용하면 삽입 위치를 어느 정도 지정할 수 있어 특정 상황에서 삽입 성능을 향상시킬 수 있지만, 최종적으로 요소는 여전히 키 순서에 맞는 올바른 위치에 배치됩니다.