自定义比较方法对比分析3

        之前在用到这方面的知识的时候会有困惑,为什么有的时候要使用函数,有时候要使用仿函数?使用仿函数的时候,为什么有时候要加(), 有时候又不加?如果你也感兴趣,可以先看前面两篇文章,再看这篇

1.为什么有的时候要使用函数,有时候要使用仿函数?

(1)set, map, priority_queue, 在传递比较方法时,需要一个类型来作为它的比较器,而函数不是类型, 所以需要使用仿函数       传递的都是仿函数,方法,所以这里没有()

set s;

priority_queue, vector>, myCompaire> prq;  

(2) std::sort:可以直接接受函数指针、仿函数或 lambda 表达式作为第三个参数

总结: 是根据需要传递的参数类型决定的

2.使用仿函数的时候,为什么有时候要加(), 有时候又不加?

(1)set 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是函数,不用保持状态,自然就不用自己创建实例,而且创建实例速度就慢了啊。

你可能感兴趣的:(C++,算法,数据结构,c++)