STL之函数对象

摘要:本文主要介绍了函数对象(仿函数)的基本概念,并且举例子对其进行基本的使用。

1、基本概念

1.1 什么是函数对象?

重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用

1.2 注意

  • 函数对象(仿函数)是一个类,不是一个函数。
  • 函数对象(仿函数)重载了”() ”操作符使得它可以像函数一样调用。

1.3 分类

假定某个类有一个重载的operator(),而且重载的operator()要求获取一个参数,我们就将这个类称为“一元仿函数”(unary functor);相反,如果重载的operator()要求获取两个参数,就将这个类称为“二元仿函数”(binary functor)。

2、STL内建函数对象

STL内建了一些函数对象。分为:算数类函数对象,关系运算类函数对象,逻辑运算类仿函数。这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数功能。使用内建函数对象,需要引入头文件 #include<functional>

 

API意义
算术类template<class T> T plus<T>加法仿函数
template<class T> T minus<T>减法仿函数
template<class T> T multiplies<T>乘法仿函数
template<class T> T divides<T>除法仿函数
template<class T> T modulus<T>取模仿函数
template<class T> T negate<T>取反仿函数
关系运算类 template<class T> bool equal_to<T> 等于
 template<class T> bool not_equal_to<T> 不等于
 template<class T> bool greater<T> 大于
 template<class T> bool greater_equal<T> 大于等于
 template<class T> bool less<T> 小于
 template<class T> bool less_equal<T> 小于等于
逻辑运算类 template<class T> bool logical_and<T> 逻辑与
template<class T> bool logical_or<T>逻辑或
template<class T> bool logical_not<T>逻辑非

 

3、代码示例

3.1 自定义的函数对象

 1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 class Myprint {  //定义重载函数调用操作符的类
 6 public:
 7     void operator() (int num){    //重载“()”
 8         cout << "num " << num << endl;
 9         count++;
10     }
11     int count = 0;
12 };
13 
14 void test01() {
15     Myprint myprint;   //定义一个函数对象
16     myprint(100);   //此时的对象就可以像函数一样调用,注意和有参构造函数相区别
17     myprint(100);
18     myprint(100);
19     cout << myprint.count << endl;  //输出3,表明函数对象可以保存状态
20     
21     //还可以使用匿名对象的方式来调用
22     Myprint()(1000);
23 }
24 
25 //函数对象作为参数
26 void doprint(Myprint print,int num) {
27     print(num);
28 }
29 
30 void test02() {
31     doprint(Myprint(), 10);  //匿名调用方法
32 
33     Myprint myprint;
34     doprint(myprint, 20);    //非匿名调用
35 }
36 
37 int main() {
38     //test01();
39     test02();
40 
41     system("pause");
42     return 0;
43 }

3.2 内建函数对象

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include<iostream>
 3 using namespace std;
 4 //内建函数对象头文件
 5 #include <functional>
 6 #include <vector>
 7 #include <algorithm>
 8 
 9 void test01()
10 {
11     //template<class T> T negate<T>//取反仿函数
12     negate<int>n;
13 
14     cout << n(10) << endl;
15 
16     //加法  template<class T> T plus<T>//加法仿函数
17 
18     plus<int> p;
19 
20     cout << p(1, 1) << endl;
21 }
22 
23 //template<class T> bool greater<T>//大于
24 
25 void test02()
26 {
27     vector<int>v;
28 
29     v.push_back(10);
30     v.push_back(30);
31     v.push_back(50);
32     v.push_back(20);
33     v.push_back(40);
34 
35     sort(v.begin(), v.end(), greater<int>());
36 
37     for_each(v.begin(), v.end(), [](int val){ cout << val << " "; });
38 }
39 
40 int main(){
41 
42     //test01();
43 
44     test02();
45 
46     system("pause");
47     return EXIT_SUCCESS;
48 }

转载于:https://www.cnblogs.com/lzy820260594/p/11398661.html

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值