쌓고 쌓다
[C++] map에서 [ ] 사용시 주의할 점 본문
먼저 아래의 코드를 보자.
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을 제대로 공부하지 않고 알고리즘 공부할때 사용하여 이게 왜 이러는지 한참 찾아보고 고민했었다...ㅠ.
'프로그래밍 > C & C++' 카테고리의 다른 글
[C/C++] 2차원 배열을 배열 포인터로 조회 및 수정 (0) | 2023.01.10 |
---|---|
openGL(GL, GLU, GLUT) 설치 방법 (0) | 2022.11.12 |
[C++] 정렬(sort 함수), compare 함수 만들기(정렬 기준 만들기) (0) | 2022.07.12 |
[C++] 배열 초기화 - fill 함수 (0) | 2022.07.09 |
[C++] 역순 만들기(뒤집기) reverse 함수 (0) | 2022.07.09 |
Comments