쌓고 쌓다

[C++] map에서 [ ] 사용시 주의할 점 본문

프로그래밍/C & C++

[C++] map에서 [ ] 사용시 주의할 점

승민아 2022. 10. 9. 14:15

먼저 아래의 코드를 보자.

int main(void)
{
	map<string, bool> m;
    
	cout << m["Hello"] << endl;
	m.insert({ "Hello",true });
	cout << m["Hello"];
}

m에 "Hello"를 조회해보고 "Hello",true를 삽입한다.

그리고 "Hello"를 출력해보자.

 

이상하게 FASLE, FALSE 값이 나온다.

 

나는 분명히 Hello를 true로 삽입하였는데 그렇다.

 

이것은 m["Hello"] 즉, [ ]로 조회할때 삽입이 이루어지기 때문이다.

즉 아래의 코드(출력)를 실행하는 순간

삽입이 이루어진다.

map<string, bool> m;
cout << m["Hello"] << endl;

 

그래서 insert "Hello" true를 해도 이미 있기에

삽입이 이루어지지 않는것이다.

삽입이 이루어지지 않아 false를 반환되어 나온거다.

m.insert({ "Hello",true }); // 이미 있어서 true로 삽입 불가!!!!

 

그래서 두번째 m["Hello"] 출력시 이미 map에 존재하여 삽입이 실패하여 false가 나온다

 

아래의 코드를 보자.

int main(void)
{
	map<string, bool> m;
	cout << m["Hello"] << endl;
	cout << m.find("Hello")->second<<endl;
	cout << m["Hello"];
}

이러면 이제 첫 m["Hello"]에서 Hello가 삽입이 이루어 졌기에

두번째 m.find("Hello")로 찾아 second를 출력하면 0이 출력이 되는것이다.

 

조회를하지않고 바로 find로 해보면 어떻게 될까?

map<string, bool> m;
cout << m.find("Hello")->second<<endl;
cout << m["Hello"];

iterator 에러가 뜬다!!

find로는 바로 삽입이 이루어지지 않음을 알 수 있다.

 

STL을 제대로 공부하지 않고 알고리즘 공부할때 사용하여 이게 왜 이러는지 한참 찾아보고 고민했었다...ㅠ.

Comments