Game Develop

[C++] map에서 원소 넣을때 insert도 활용하자. 본문

C++/C++

[C++] map에서 원소 넣을때 insert도 활용하자.

MaxLevel 2022. 10. 29. 07:00

그냥 map[i] = 1; 이런식으로 []연산자만 이용했었다.

그런데 insert를 사용하면 성능이 약간 더 좋고, 이미 해당 key값이 들어가 있는지 아닌지 판별할 수 있다.

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
 
    map<charint> visit;
    visit.insert({ 'a',500 });
    visit.insert({ 'b',300 });
    
    pair<map<char,int>::iterator,bool> returnedValue = visit.insert({ 'a',200 });
 
    if (!returnedValue.second) // a라는 키값이 이미 있기에 false를 리턴.
    {
        cout << "이미 a라는 key값은 들어있으며, " << returnedValue.first->second << "라는 대응되는 값이 들어가있음" << endl;
    }
 
    return 0;
}
cs

이미 a,500이라는 값을 map에 넣은 상태에서, 똑같은 key값인 a,200을 insert를 통해 넣으려고 한다고 가정한다.

결과는 다음과같다.

 

코드에서 보다시피 insert함수의 리턴값은 pair<iterator, bool> 이다.

중복된 key값을 insert하려할 경우 first에는 이미 들어가있는 iterator와, second에는 false를 반환한다.

map에는 이미 key값이 a인게 들어가 있기 때문에 다시 a라는 key값을 넣으려고 하니 위와 같은 결과가 나온것이다..

이렇게 insert의 반환값을 이용해서 넣으려는 key값이 이미 있는지 없는지 체크할 수 있다.

아예 넣을 수 없으니 값이 overwrite 되지 않는다. 

 

다만 []연산자는 값을 overwrite 한다.

m[3] = 10;을 한 후에 m[3] = 50을 하면 50으로 값이 덮어씌워진다.

이게 가능한 이유는 []연산자는 해당 원소에 대응하는 참조를 반환하기 때문이다.

 

 

반드시 중복되지 않게 값을 넣어야 할 경우 insert를 사용하자.

 

 

 

 

'C++ > C++' 카테고리의 다른 글

[C++] Iterator (반복자)  (0) 2022.11.02
[C++] vector  (0) 2022.11.01
[C++] String 성능에 관하여  (0) 2022.10.26
[C++] 포인터와 배열의 차이.  (1) 2022.10.08
[C++] Hash  (0) 2022.09.11