이 글에서는 C++ STL에서 map::operator[](대괄호 [] 연산자)의 동작 원리, 문법 그리고 실제 예제를 자세히 살펴보겠습니다.
C++ STL에서 맵(Map)이란?
맵(Map)은 연관 컨테이너(associative container)의 한 종류로, 키(key)와 매핑된 값(mapped value)의 조합으로 이루어진 요소들을 특정 순서에 따라 저장할 수 있도록 도와줍니다. 맵 컨테이너 내부에서 데이터는 항상 연관된 키를 기준으로 자동 정렬되며, 각 요소는 고유한 키를 통해서만 접근할 수 있습니다.
map::operator[]란 무엇인가?
map::operator[]는 참조 연산자(reference operator)로, 키를 이용해 컨테이너 내부의 요소에 접근할 때 사용됩니다.
만약 컨테이너 안에 해당 키가 존재하지 않으면, 이 연산자는 그 키로 새로운 요소를 자동으로 삽입한 뒤 매핑된 값의 참조를 반환합니다. 동작 방식은 map::at()과 유사하지만 중요한 차이점이 하나 있습니다. at()은 키가 맵에 존재하지 않을 경우 out_of_range 예외를 던지는 반면, operator[]는 새 요소를 생성한다는 점입니다.
문법(Syntax)
Map_name[key];
매개변수(Parameter)
매개변수는 단 하나뿐입니다. 바로 컨테이너에서 참조하고자 하는 키 k입니다.
반환값(Return Value)
이 연산자는 키 k와 연관된 값(value)의 참조를 반환합니다.
입력 예시
map<int, int> newmap;
newmap.insert({1, 20});
newmap.insert({2, 30});
newmap[1];
출력 결과
20
예제 1
#include <bits/stdc++.h>
using namespace std;
int main(){
map<int, int> TP_1;
TP_1[1] = 10;
TP_1[2] = 20;
TP_1[3] = 30;
TP_1[4] = 40;
cout << "Element at TP[3] is : " << TP_1[3];
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Element at TP[3] is : 30
예제 2
#include <bits/stdc++.h>
using namespace std;
int main(){
map<int, int> TP_1;
TP_1[1] = 10;
TP_1[2] = 20;
TP_1[3] = 30;
TP_1[4] = 40;
cout << "Element at TP[3] is : " << TP_1[3];
if(TP_1[5] == 0){
cout << "\nElement at TP[5] doesn't exist";
}
else{
cout << "Element at TP[5] is : " << TP_1[5];
}
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Element at TP[3] is : 30
Element at TP[5] doesn't exist
주의할 점
operator[]는 존재하지 않는 키로 접근할 때 새 요소를 삽입한다는 점에 유의해야 합니다. 예제 2에서 TP_1[5]에 접근하는 순간 값이 0인 새 요소가 맵에 추가됩니다. 따라서 단순히 키의 존재 여부만 확인하고 싶다면 find() 또는 count() 함수를 사용하는 것이 맵을 변경하지 않고 안전하게 검사할 수 있는 방법입니다.