之前在用到这方面的知识的时候会有困惑,为什么有的时候要使用函数,有时候要使用仿函数?使用仿函数的时候,为什么有时候要加(), 有时候又不加?如果你也感兴趣,可以先看前面两篇文章,再看这篇
1.为什么有的时候要使用函数,有时候要使用仿函数?
(1)set, map, priority_queue, 在传递比较方法时,需要一个类型来作为它的比较器,而函数不是类型, 所以需要使用仿函数 传递的都是仿函数,方法,所以这里没有()
set<Person, comparePerson> s;
priority_queue<pair<int, int>, vector<pair<int, int>>, myCompaire> prq;
(2) std::sort
:可以直接接受函数指针、仿函数或 lambda 表达式作为第三个参数
总结: 是根据需要传递的参数类型决定的
2.使用仿函数的时候,为什么有时候要加(), 有时候又不加?
(1)set<Person, comparePerson> s; 仿函数后面没有加 (),当你定义一个 std::set
时,第二个模板参数是一个类型,而不是该类型的实例。这意味着你只需要提供比较器的类型信息,而不需要提供具体的实例,如果加了(),提供的就是实例而不是类型了。
(2)std::sort
需要一个具体的比较函数或比较器对象作为第三个参数。这是因为 std::sort
是一个算法,它直接调用提供的比较器来对序列进行排序。因此,你需要提供一个具体的比较器实例。
总结: 是根据需要传递的参数类型决定的
3. set 的参数为什么是类型?
(1)set 它们的实现都是模板,给模板传递的当然都是类型,而不是实例了。
(2)性能考虑:对于 std::set
,由于比较器对象是成员变量的一部分,通常只会创建一次,并在整个容器生命周期内使用同一个实例。
(3)状态保持:如果 MyCompare
包含状态(即成员变量),那么在 std::set
中的状态会在整个容器生命周期内保持一致,这里也可以说明为什么要使用仿函数而不是函数,因为仿函数可以有状态,而函数没有。
4. sort 的参数为什么是函数或者实例?
可以类比上一个问题,就能得到大概的答案了,sort 是一个函数,传递的参数是要为sort服务的,传递函数,实例,sort是可以直接调用的,如果传递类型就没法调用了,sort是函数,不用保持状态,自然就不用自己创建实例,而且创建实例速度就慢了啊。
我创建了知识星球,在这里分享自己的学习所得和生活感悟,欢迎加入,一起学习,交个朋友。下面是新人券,欢迎领取后加入。