【问题标题】:using comparison function in stl container在 stl 容器中使用比较函数
【发布时间】:2010-12-15 13:30:45
【问题描述】:

为什么我可以这样做:

stable_sort(it1, it2, binary_function);

但不是这个:

priority_queue<type, vector<type>, binary_function> pq;

为什么我可以在第一种情况下使用函数,但在第二种情况下需要一个对象?

【问题讨论】:

    标签: c++ stl comparator predicates


    【解决方案1】:

    priority_queue 是一个模板,它需要一个类型作为参数,其中binary_function 是一个函数对象。

    【讨论】:

    • 精度:在 C++0x 中,您可以使用decltype 从对象中检索类型(静态)
    【解决方案2】:

    如果您查看std::stable_sort 上的引用,您会看到您提供的binary_function 也应该是一个函数对象......两者之间没有区别,除了可能在第二种情况下没有适当的“强制转换”或从函数到适当的函数对象的转换。

    我相信这可能是因为*sort函数直接使用函子,并且立即,因此如果函数地址在*sort函数被调用时是有效的,它将在持续时间内有效函数调用。在创建使用 this 作为数据成员的容器时(本质上),您不能确定函数引用会在容器对象的生命周期内失效。我知道这是一个松散的挥手解释,但这是我能想到的最好的解释。或许在 C++ 中,对二进制函数的引用会被隐式转换为 std::function 的构造,这样函数就会被“复制”并且不存在有效性问题。

    希望我现在没有失去你……

    【讨论】:

    • 在第一种情况下,binary_function 是函数对象实例的名称或函数的名称。因此,它不能用于模板参数必须是类型名称(不是变量/函数名称)的第二种情况。
    • 函数对象仍然是一个类,对吧?类似于bool operator( arg ) 的结构。否则它只是一个函数的地址,当然也可以使用,但在这种情况下恕我直言(由于该引用的未知生命周期问题)
    • 类和这个类的实例是有区别的。 MyFunctor fun; - MyFunctor 是类的名称,fun 是实例的名称。 stable_sort 采用fun(推导参数的类型),priority_queue 的模板参数采用MyFunctor
    猜你喜欢
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2018-05-31
    相关资源
    最近更新 更多