[2번]
/*
STL의 less<T> 함수 객체와 같은 동작을 하는 사용자 Less<T> 함수 객체를 구현하세요.
단, Less<T>는 어댑터 적용이 가능해야 합니다
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
template <typename T>
struct Less :public binary_function<T, T, T>
{
bool operator()(const T &left, const T &right) const
{
return left < right;
}
};
int main(void)
{
vector<int> v;
v.push_back(50);
v.push_back(40);
v.push_back(30);
v.push_back(20);
v.push_back(10);
cout << "전: ";
for (vector<int>::size_type i = 0; i < v.size(); i++)
cout << v[i] << " ";
cout << endl;
sort(v.begin(), v.end(), Less<int>());
cout << "후: ";
for (vector<int>::size_type i = 0; i < v.size(); i++)
cout << v[i] << " ";
cout << endl;
//어댑터 적용
cout << "40보다 작은 수의 갯수: " << count_if(v.begin(), v.end(), bind2nd<Less<int>>(Less<int>(), 40)) << endl;
return 0;
}
[3번]
/*
bind1st()와 bind2nd()의 차이점을 간단한 예제 코드로 비교하세요
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
int main(void)
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
cout << "v: ";
for (vector<int>::size_type i = 0; i < v.size(); i++)
cout << v[i] << " ";
cout << endl;
cout << "bind1st 적용(30보다 큰 수의 갯수): " << count_if(v.begin(), v.end(), bind1st<less<int>>(less<int>(), 30)) << endl; //40 50
cout << "bind2nd 적용(40보다 작은 수의 갯수): " << count_if(v.begin(), v.end(), bind2nd<less<int>>(less<int>(), 40)) << endl;//10 20 30
return 0;
}
[4번]
/*
not1과 not2의 차이점을 간단한 예제 코드로 비교하세요
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
struct Range :public unary_function<int, bool> //단항 조건자
{
bool operator()(int n) const
{
return n > 50;
}
};
struct Equal :public binary_function<int, int, bool> //이항 조건자
{
bool operator()(int n1, int n2) const
{
return n1 == n2;
}
};
int main(void)
{
//not2는 이항 조건자를 대상으로 not1은 단항 조건자를 대상으로 적용
cout << "40은 50보다 큰가?: " << Range()(40) << endl;
cout << "40은 50보다 작거나 같은가?: " << not1(Range())(40) << endl;
int num1 = 30, num2 = 50;
cout << "num1과 num2는 같은가?: " << Equal()(num1, num2) << endl;
cout << "num1과 num2는 다른가?: " << not2(Equal())(num1, num2) << endl;
return 0;
}
[5번]
/*
다음 코드를 보고 v 컨테이너 모든 원소의 x, y를 5씩 증가하는 for_each() 알고리즘을 완성하시오
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
class Point
{
private:
int x, y;
public:
explicit Point(int _x = 0, int _y = 0) :x(_x), y(_y)
{
}
void Print() const
{
cout << "(" << x << ", " << y << ") ";
}
int GetX() const
{
return x;
}
int GetY() const
{
return y;
}
void Inc() //추가한 함수
{
x += 5;
y += 5;
}
};
int main(void)
{
vector<Point> v;
v.push_back(Point(1, 1));
v.push_back(Point(2, 2));
v.push_back(Point(3, 3));
v.push_back(Point(4, 4));
v.push_back(Point(5, 5));
cout << "변경 전 v: ";
for_each(v.begin(), v.end(), mem_fun_ref(&Point::Print));
cout << endl;
//for_each()를 호출해 모든 원소의 x, y를 +5만큼 증가한다
for_each(v.begin(), v.end(), mem_fun_ref(&Point::Inc));
cout << "변경 후 v: ";
for_each(v.begin(), v.end(), mem_fun_ref(&Point::Print));
cout << endl;
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
[참고] 뇌를 자극하는 C++ STL
'C++ > 뇌를 자극하는 C++ STL' 카테고리의 다른 글
뇌를 자극하는 C++ STL 이것만은 알고 갑시다 11장 (0) | 2018.01.19 |
---|---|
뇌를 자극하는 C++ STL 이것만은 알고 갑시다 10장 (0) | 2018.01.12 |
뇌를 자극하는 C++ STL 이것만은 알고 갑시다 8장 (0) | 2018.01.11 |
뇌를 자극하는 C++ STL 이것만은 알고 갑시다 7장 (0) | 2018.01.08 |
뇌를 자극하는 C++ STL 이것만은 알고 갑시다 6장 (0) | 2018.01.07 |