[Basic C++] #43_STL 알고리즘, find, find_if
STL 알고리즘 중 "find", 그리고 "find_if"에 대해 알아보겠습니다.
"전문가를 위한 C"의 17 항목, "STL 알고리즘 마스터하기"에 해당하는 내용입니다.
Overview
- 개념
- find()
- find_if()
#0. 개념
1. find()?
template<class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& val);
- STL 알고리즘 중 "find()" 메서드를 먼저 살펴보겠습니다.
- 앞선 포스팅에서 살펴봤듯이 STL이 제공하는 컨테이너들은 "반복자"를 매개로 제네릭 알고리즘을 수행합니다.
- 그중 "find()" 메서드는 지정 구간 안에서 특정 항목 값을 찾습니다.
- 인자로 구간의 첫 번째와 마지막 반복자, 그리고 찾고자 하는 항목 값을 받습니다.
- "find()" 메서드의 반환 값은 특정 항목을 찾았을 경우 그 항목을 가리키는 반복자를 반환하며, 찾지 못했을 경우 컨테이너의 "end()"를 반환합니다.
- * 주의 : 반환 값이 boolean이 아니라 반복자인 것을 명심합시다!
#1. find() 예제
1. 예제 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
int num;
vector <int> v;
v.push_back(30);
v.push_back(46);
v.push_back(100);
v.push_back(50);
v.push_back(95);
v.push_back(93);
while (true)
{
cout << "Enter a number to lookup (0 to stop)" << '\n';
cin >> num;
if (num == 0)
break;
auto p = find(cbegin(v), cend(v), num);
if (p == cend(v))
cout << "없어용" << '\n';
else
cout << "있어용" << " " << *p << '\n';
}
}
#2. find_if() 예제
1. find_if()?
template <class InputIterator, class UnaryPredicate>
InputIterator find_if(InputIterator first, InputIterator last, UnaryPredicate pred);
- "find_if()" 메서드는 "find()" 메서드와 다릅니다.
- "find_if()" 메서드는 마지막 인자로 찾고자 하는 특정 항목을 받지 않고, 선택용 콜백 함수(Predicate funciton callback)를 받습니다.
- 이때, 프레디킷은 사용자가 직접 작성하는 함수로 단항 혹은 이항 조건자를 반환하여 지정된 구간 안에서 항목 값이 조건과 합치하는지 체크하고, 가장 먼저 합치하는 항목의 반복자를 반환하고 종료합니다.
2. 예제 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool Pred(int n)
{
return n >= 100;
}
int main()
{
ios_base::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
int num;
vector <int> v;
v.push_back(30);
v.push_back(46);
v.push_back(35);
v.push_back(50);
v.push_back(95);
v.push_back(93);
auto p = find_if(cbegin(v), cend(v), Pred);
if (p == cend(v))
cout << "없어용" << endl;
else
cout << "있어용" << " " << endl;
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool Pred(int n)
{
return n >= 100;
}
int main()
{
ios_base::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
int num;
vector <int> v;
v.push_back(30);
v.push_back(46);
v.push_back(35);
v.push_back(50);
v.push_back(95);
v.push_back(100);
auto p = find_if(cbegin(v), cend(v), Pred);
if (p == cend(v))
cout << "없어용" << endl;
else
cout << "있어용" << " " << endl;
}
'언어 > Basic C++' 카테고리의 다른 글
[Basic C++] #45_람다 표현식 활용, 제네릭 람다 표현식, 람다 캡처 표현식, 리턴 타입으로서 람다 표현식 (0) | 2022.07.06 |
---|---|
[Basic C++] #44_람다 표현식, 기본 (0) | 2022.07.05 |
[Basic C++] #42_unordered_multimap, 비순차 연관 컨테이너, 중복 허용 (0) | 2022.06.28 |
[Basic C++] #41_unordered_map, 비순차 연관 컨테이너 (0) | 2022.06.28 |
[Basic C++] #40_해시함수, 비순차 연관 컨테이너, 해시 테이블 (0) | 2022.06.24 |