boj 13414번 문제를 통해 익히는 unordered_map의 find() 함수와, min() 함수에 사용하는 (int) size() 함수에 대하여.
        if(s.find(s_num)!=s.end()){
            s.erase(s_num);
            s[s_num]=i;
        }

일단 unordered_map을 이용한 풀이에서, unordered_map 내에 그 원소가 있는 경우라면, 위와 같은 형태로

if(s.find(s_num)!=s.end()) 형태로 if문을 통해서 경우를 나누어서 코드를 작성하는데, 

왜 s.fin(s_num)!=s.end()) 처럼, s.end()를 이용하여서 판단하는지에 대해서 궁금하여서 검색해보았다. 

검색해본 내용을 보면, unordred_map에 있는 find() 함수의 경우는 원소가 있다면 그 iterator를, 없다면 

unordered_map의 end()를 가리키는 반복자를 반환한다고 한다. 

그래서 만약 find()를 통해 원소를 발견했다면, 그건 end()가 아닐테니 !=end() 형태로 코드를 작성해서 그 원소가 있는 경우를 나타낼 수 있는 것이다. 

 

앞으로 unordered_map을 사용한 문제들을 많이 풀어볼텐데, 그 원소가 있는 경우를 나타내기 위해서는 위와 같은 형태의 코드를 잘 이해하고 활용하도록 하자. 

 

그리고 이 문제를 푸는데 같이 접하게된 내용으로, 

 

int en=min(k,(int)slist.size()); 형태의 코드를 접하게 되었는데, 

처음에는 unsigned int를 반환하니까 그냥 맞추어주려고 (int)를 사용하고, (int)를 사용하지 않더라도 코드는 실행될 것이라고 생각하였는데, 막상 (int) 없이 코드를 작성해보니까 에러메세지를 받을 수 있었다 

아무래도 min() 함수 자체가 (int, size_t) 형태로는 받아들일 수 없게 구현이 되어있는것으로 보여진다.

 그래서 혹시 앞으로도 int와 size()함수의 값을 비교해야 하는 min, 혹은 max의 경우라면, 

size()함수의 값 앞에 (int)를 붙여주어서 타입을 맞추어 주도록 하자. 

 

위 사항의 경우 다음에 다시 접하면 또 다시 정리해보면서 기억하고 익숙해 지도록 하자. 

 

  Comments,     Trackbacks