언어/Basic C++

[Basic C++] #43_STL 알고리즘, find, find_if

Hardii2 2022. 7. 5. 08:21

 

[Basic C++] #43_STL 알고리즘, find, find_if

 

STL 알고리즘 중 "find", 그리고 "find_if"에 대해 알아보겠습니다.

"전문가를 위한 C"의 17 항목, "STL 알고리즘 마스터하기"에 해당하는 내용입니다.

 


 

Overview

 

  1. 개념
  2. find()
  3. 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;

}