티스토리 뷰

C++

[C++] find vs find_if 차이점

코딩류 2021. 10. 31. 22:51
반응형

알고리즘 문제 풀다가 급 궁금해져서 찾아본 

find와 find_if의 차이점

 


1. find, find_if

 

 둘 다 algorithm 헤더에 정의되어 vector 안에 특정 값이 존재하는지 찾아주는 함수입니다. 하지만 find는 찾고자 하는 값의 타입에 operator== 가 정의되어 있어야 사용가능하고 그렇지 않다면 find_if에 비교식을 만들어 넣어야 한다는 점이 다르다고 볼 수 있습니다. 

 이렇게만 적으면 무슨 소리인가 싶으실 테니 각 함수의 정의를 보겠습니다. 

 

find

template <class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& val);

 

 맨 마지막 val 인자의 타입 T에 operator== 가 정의되어 있어야 사용 가능 

 

 

find_if

template <class InputIterator, class UnaryPredicate>
InputIterator find_if(InputIterator first, InputIterator last, UnaryPredicate pred);

 

 맨 마지막 pred 인자에 내가 원하는 조건식(bool 리턴값을 가지는)을 작성해서 넣어주면 됩니다. 

 

 

 저 차이가 왜 중요하냐면, 방금 제가 알고리즘 문제 풀면서 vector<pair<char, char>> 에서 find 함수를 썼는데 에러 나서 컴파일이 안 됐거든요... 그래서 구글링 하다가 pair 구조체의 특정 값으로 찾으려면 find_if를 써야 한다는 것을 알게 되었습니다. 그래서 두 함수 차이가 뭔가 궁금해져서 문제를 풀자마자 찾아보았습니다. 

 

 

잘못 작성한 코드 

    vector<pair<char, int>> words;
    for (int i = 0; N > i; i++)
    {
        string str;
        cin >> str;
        for (int j = 0; str.length() > j; j++)
        {
            int len = str.length() - j - 1;
            
            //처음에 문제가 되었던 부분 ↓
            auto it = find(words.begin(), words.end(), str[j]);
            if (words.end() == it)
                words.emplace_back(make_pair(ch, pow(10, len)));
            else
                it->second += pow(10, len);
        }
    }

 

 vector<pair<char, char>> 배열에서 key값을 기준으로 찾으려고 했었어요. 보통은 key, value 쌍을 가지는 컨테이너에서 key 값을 기준으로 자동 오름차순 정렬 하길래 암 생각없이,,, 좀 막연하게,, ㅋㅋㅋㅋㅋ ,,,, 저렇게 썼죠. 

 결과는 컴파일 자체가 안 됨 ㅠ.ㅠ 

 컴파일러도 계속 저기가 문제라 그러고 하니 구글링 해 본 결과 pair 구조체에는 operator== 가 정의되어 있지 않아서인거 같았습니다. 

 

 

cppreference 가 보니까 되어 있지 않네요,,,ㅋㅋㅋ 무지했음 ㅠㅠ 

 

 

수정한 코드

    vector<pair<char, int>> words;
    for (int i = 0; N > i; i++)
    {
        string str;
        cin >> str;
        for (int j = 0; str.length() > j; j++)
        {
            int len = str.length() - j - 1;
            
            char ch = str[j];
            //수정한 코드 ↓
            auto it = find_if(words.begin(), words.end(), 
            [&ch](const pair<char, int>& elem){ return elem.first == ch; });
            if (words.end() == it)
                words.emplace_back(make_pair(ch, pow(10, len)));
            else
                it->second += pow(10, len);
        }
    }

 

 find_if를 이용해서 마지막 인자값에 제가 원하는 결과를 도출할 수식을 넣어주고 나서야 정상 컴파일 되었습니다. 

 

 

오늘의 교훈

잊지말자...
operator== 가 정의되어 있지 않다면 find_if를 써야 한다는 것을...

 

반응형

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

[C++] std::vector push_back vs emplace_back 차이점  (0) 2021.11.26
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함