了解STL的比较器仿函数

时间:2018-01-27 21:04:42

标签: c++ c++11 stl functor

所以我一直在STL中使用比较器函子,但从未真正理解返回真或假的含义。我必须运行它并一直调整仿函数。例如,假设我有以下代码

struct functor
{
    // does returning true place a before b ?
    bool operator()(int a,int b)
    {
        if (a < b)
            return true;
        return false;
    }
};

int main() 
{
    std::priority_queue<int, std::vector<int>,functor> q;
    for(int n : {1,8,5,6,3,4,0,9,7,2})
        q.push(n);
}

有人可以澄清这个

bool operator()(int a,int b)
    {
        if (a < b)
            return true;
        return false;
    }

a之前返回一个真实的地方b吗?我试图提出类似&#34;如果a小于b而不是返回true而true则意味着将在b&#34之前放置。但显然这是不正确的

4 个答案:

答案 0 :(得分:2)

您可以随时查看文档。

来自priority_queue

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;
  

比较 - 提供严格弱排序的比较类型。

然后,检查Compare

  

概念比较是一些预期的要求   来自用户提供的函数对象的标准库工具   类型。

     

应用于对象的函数调用操作的返回值   类型比较,当上下文转换为bool时,产生true,如果   调用的第一个参数出现在严格的第二个参数之前   此比较类型引起的弱排序关系,以及false   否则

这意味着,functor::operator()应该接受两个参数(ab),如果“true”出现在“{{1}之前”,则返回a虽然“之前出现”规则是由b的实现定义的(此实现必须符合functor::operator()概念强加的要求)。

答案 1 :(得分:1)

是的,如果您的功能是

bool operator(T a, T b); 

如果返回true,则表示a在排序顺序中放在b之前。但是,优先级队列是有序的,因此如果a放在b之前,b将高于队列中的a。所以,如果

bool operator (T a, T b) { return a < b; }
使用

,&#34;最大&#34> element将位于队列的顶部。

答案 2 :(得分:-1)

<进行排序的惯例。你的代码

bool operator()(int a,int b)
{
    if (a < b)
        return true;
    return false;
}

相同
bool operator()(int a, int b)
{
    return a < b ;
}

另外,请查看Operator< and strict weak ordering

答案 3 :(得分:-1)

为什么不这样做,因为它更简单:

bool operator()(int a, int b)
{
    return a < b
}

作为优先级队列的排序函数,您需要提供的函数应该是二进制函数,如果b大于a,或者第一个参数大于b,则返回true。

如果条件不正确,sort函数内部可能会使用这两个值的简单交换。

  

二进制函数,它接受范围中的两个元素作为参数,并返回一个可转换为bool的值。返回的值表示作为第一个参数传递的元素是否被认为是在它定义的特定严格弱顺序中的第二个参数之前。   该函数不得修改其任何参数。   这可以是函数指针或函数对象。

http://www.cplusplus.com/reference/algorithm/sort/