티스토리 뷰
알고리즘 문제 풀다가 급 궁금해져서 찾아본
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
- 하드웨어
- 기초
- 해커랭크
- 프로그래머스
- 캐나다
- dp
- 백준
- 애플
- 코딩공부
- 문제풀이
- DFS
- 다이나믹프로그래밍
- 컴퓨터공부
- c언어
- 캐나다생활
- 그리디
- c++
- 깊이우선탐색
- C언어기초
- 컴퓨터
- 스위프트플레이그라운드
- 너비우선탐색
- greedy
- BFS
- 영어공부
- 알고리즘
- 컴퓨터사이언스
- hackerrank
- 프로그래밍
- 아이패드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |