C++/뇌를 자극하는 C++ STL

뇌를 자극하는 C++ STL 이것만은 알고 갑시다 9장

꾸준함. 2018. 1. 11. 21:34

[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

반응형