C++의 std::map을 사용할 때 이 사실을 몰라 한참동안 삽질에 빠진 사람들을 많이 보았다.

C++의 STL을 사용해본 사람이라면 99%는 map을 사용해봤을 것이다. 하지만 모두가 그 기능을 정확히 알고 사용하지는 않는다.

그렇기 때문에 모두가 한 번 쯤은 당하기 쉬운 사실에 대해서 설명해보고자 한다.

문제의 원인을 찾아보자

우선 아래의 코드와 실행 결과를 보고 문제의 원인을 찾아보자.

#include <bits/stdc++.h>

int main() {
	std::map<int, int> mp_test;
	mp_test.insert({2, 2});
	if (mp_test[1]) {
		std::cout << "The value of Key 1 is: " << mp_test[1] << '\\\\n';
	}
	mp_test.insert({1, 1});
	for (auto each : mp_test) {
		std::cout << each.first << " : " << each.second << '\\\\n';
	}
	return 0;
}

Untitled

분명 맵에 Key 1을 가지는 요소가 있는지 체크하고 이후 바로 insert()로 value에 1을 넣었다. 하지만 마지막에 맵에 저장된 모든 요소를 순회해보니 key 1에 value 0이 저장되어 출력되었다.

대체 무슨 일이 일어난걸까?

std::map::operator[]의 비밀

사실.. map의 인덱스 참조 연산자는 놓치기 쉬운 비밀이 숨겨져 있다.