立山 发表于 6 天前

函数对象-C++

1.界说

https://i-blog.csdnimg.cn/direct/bf7a078bd7e14b66bfcc3a8724e7c904.png
2.特点

、https://i-blog.csdnimg.cn/direct/c513e570cef3434686740c765f2a7e8b.png
1.解释第一句

#include<stdio.h>
using namespace std;
#include<string>
#include<map>
#include <iostream>
class print
{
public:
        void operator()(string s)
        {
                cout << s << endl;
        }
};
int main()
{
        print print;
        print("hello world");
        return 0;
} 2.解释第二句

可以有本身的状态:指的是他宁静凡的函数差别,比方他可以统计本身调用了几次。
也就是说,它可以向函数一样被调用,但是却拥有类的功能,他是类和函数的结合。
#include<stdio.h>
using namespace std;
#include<string>
#include<map>
#include <iostream>
class print
{
public:
        print()
        {
                this->count = 0;
        }
        void operator()(string s)
        {
                cout << s << endl;
                this->count++;
        }
        int count;
};
int main()
{
        print print;
        print("hello world");
        print("hello world");
        print("hello world");
        print("hello world");
        print("hello world");
        cout << print.count << endl;
        return 0;
} 3.解释第三句

#include<stdio.h>
using namespace std;
#include<string>
#include<map>
#include <iostream>
class print
{
public:
        print()
        {
                this->count = 0;
        }
        void operator()(string s)
        {
                cout << s << endl;
                this->count++;
        }
        int count;
};
void test(print p, string s)
{
        p(s);
}
void test01()
{
        print print;
        test(print, "C++");
}
int main()
{
        test01();
        return 0;
} 函数对象不但可以作为函数参数,还可以再调用的函数中去使用本身重载过的小括号
   具体见
void test(print p, string s)
{
    p(s);
}
https://i-blog.csdnimg.cn/direct/57ca6454fb7d4cf697020ba8ed2d71b5.png
3.内建函数对象

1.界说

https://i-blog.csdnimg.cn/direct/8bb271ac842748bebbb6a9fe61f9d467.png
2.内建函数对象-算数仿函数

1.函数原型

https://i-blog.csdnimg.cn/direct/52b2c3a520ca42caa9e1015d0a2dbd47.png
2.取反仿函数(一元仿函数)

#include<stdio.h>
using namespace std;
#include<string>
#include<vector>
#include<functional>
#include <iostream>
int main()
{
        negate<int>n;
        cout << n(10) << endl;
        return 0;
} https://i-blog.csdnimg.cn/direct/a8c3bc4346cd40c5857eca6ff9cae04e.png

3.加法仿函数(二元仿函数)

#include<stdio.h>
using namespace std;
#include<string>
#include<vector>
#include<functional>
#include <iostream>
int main()
{
        plus<int>n;
        cout << n(10,20) << endl;
        return 0;
} https://i-blog.csdnimg.cn/direct/5b6edf2b6bb94b3e9b935c139a6e5e61.png

注意:plus模板参数列表中只须要有一个int就行,是为了防止出现两个差别范例的数据相加
4.内建函数对象-关系仿函数

1.函数原型

https://i-blog.csdnimg.cn/direct/098c1e350eaa484a94e87ddfc8f75f55.png
2.代码

#include<stdio.h>
using namespace std;
#include<string>
#include<vector>
#include<functional>
#include<algorithm>
#include <iostream>
int main()
{
        vector<int> v;
        v.push_back(1);
        v.push_back(5);
        v.push_back(3);
        v.push_back(2);
        sort(v.begin(), v.end(), greater<int>());
        for (int i = 0; i < v.size(); i++)
        {
                cout << v << endl;
        }
        return 0;
} 5.内建函数对象-逻辑仿函数

1.函数原型

https://i-blog.csdnimg.cn/direct/350caf5ea6984db196e81c25d32f9f4b.png
2.代码

#include<stdio.h>
using namespace std;
#include<string>
#include<vector>
#include<functional>
#include<algorithm>
#include <iostream>
int main()
{
        vector<int> v;
        v.push_back(1);
        v.push_back(5);
        v.push_back(3);
        v.push_back(2);
        vector<int> v1;
        v1.resize(v.size());
        transform(v.begin(), v.end(),v1.begin(), logical_not<bool>());
        for (int i = 0; i < v.size(); i++)
        {
                cout << v << " ";
        }
        cout << endl;
        for (int i = 0; i < v1.size(); i++)
        {
                cout << v1 << " ";
        }
        cout << endl;
        return 0;
} https://i-blog.csdnimg.cn/direct/487b9fbb77814e05a3de3578aa270c81.png
   其中用到了搬运函数transform,须要提前给他开发相应的空间
    v1.resize(v.size());
    transform(v.begin(), v.end(),v1.begin(), logical_not<bool>());
4.注意

逻辑仿函数现实应用较少,相识即可

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 函数对象-C++