프로그래밍 기록/c++
함수 객체 dualinstance, Predicate, not2, IsMulti, bind2nd, ptr_fun, mem_fun
hominic
2023. 12. 9. 09:28
728x90
반응형
dualinstance,
#include <iostream>
#include <list>
#include <vector>
#include <algorithm>
using namespace std;
void functor1(int a)
{
printf("%d ",a);
};
struct functor2 {
void operator()(double a) const {
printf("%f\n",a);
}
};
void main()
{
int ari[]={1,2,3,4,5};
vector<int> vi(&ari[0],&ari[5]);
double ard[]={1.2,3.4,5.6,7.8,9,9};
list<double> ld(&ard[0],&ard[5]);
for_each(vi.begin(),vi.end(),functor1);
cout << endl;
for_each(ld.begin(),ld.end(),functor2());
}
Predicate
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
struct IsMulti3 : public unary_function<int,bool> {
bool operator()(int a) const {
return (a % 3 == 0);
}
};
void main()
{
int ari[]={1,2,3,4,5,6,7,8,9,10};
vector<int> vi(&ari[0],&ari[10]);
vector<int>::iterator it;
for (it= vi.begin();;it++) {
it=find_if(it, vi.end(), IsMulti3());
if (it== vi.end()) break;
cout << *it << "이(가) 있다" << endl;
}
}
not2
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
struct compare : public binary_function<string,string,bool> {
bool operator()(string a,string b) const {
return stricmp(a.c_str(),b.c_str()) < 0;
}
};
void main()
{
string names[]={"STL","MFC","owl","html","pascal","Ada",
"Delphi","C/C++","Python","basic"};
vector<string> vs(&names[0],&names[10]);
sort(vs.begin(),vs.end(),not2(compare()));
vector<string>::iterator it;
for (it=vs.begin();it!=vs.end();it++) {
cout << *it << endl;
}
}
IsMulti
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
struct IsMulti : public binary_function<int,int, bool> {
bool operator()(int a,int b) const {
return (a % b == 0);
}
};
void main()
{
IsMulti IM;
if (IM(6,3)) { cout << "6은 3의 배수이다." << endl; }
if (IM(9,2)) { cout << "9는 2의 배수이다." << endl; }
}
bind2nd
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
struct IsMulti : public binary_function<int,int, bool> {
bool operator()(int a,int b) const {
return (a % b == 0);
}
};
void main()
{
int ari[]={1,2,3,4,5,6,7,8,9,10};
vector<int> vi(&ari[0],&ari[10]);
vector<int>::iterator it;
for (it=vi.begin();;it++) {
it=find_if(it, vi.end(), bind2nd(IsMulti(),3));
if (it==vi.end()) break;
cout << *it << "이(가) 있다" << endl;
}
}
ptr_fun
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
bool IsMultiFunc(int a,int b)
{
return (a % b == 0);
}
void main()
{
int ari[]={1,2,3,4,5,6,7,8,9,10};
vector<int> vi(&ari[0],&ari[10]);
vector<int>::iterator it;
for (it=vi.begin();;it++) {
it=find_if(it, vi.end(), bind2nd(ptr_fun(IsMultiFunc),3));
if (it==vi.end()) break;
cout << *it << "이(가) 있다" << endl;
}
}
mem_fun
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
class Natural
{
private:
int num;
public:
Natural(int anum) : num(anum) {
SetNum(anum);
}
void SetNum(int anum) {
if (anum >= 0) {
num=anum;
}
}
int GetNum() { return num; }
bool IsEven() { return num % 2 == 0; }
};
void delnatural(Natural *pn)
{
delete pn;
}
void main()
{
vector<Natural *> vn;
vn.push_back(new Natural(1));
vn.push_back(new Natural(2));
vn.push_back(new Natural(3));
vn.push_back(new Natural(4));
vector<Natural *>::iterator it;
for (it=vn.begin();;it++) {
it=find_if(it, vn.end(), mem_fun(&Natural::IsEven));
if (it==vn.end()) break;
cout << (*it)->GetNum() << "이(가) 있다" << endl;
}
for_each(vn.begin(),vn.end(),delnatural);
}
728x90
반응형