【问题标题】:Understanding a Comparator functor for STL了解 STL 的比较器函子
【发布时间】:2018-01-27 21:04:42
【问题描述】:

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

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;
    }

b 之前返回一个真实的地方a 吗?我正在尝试提出类似“如果 a 小于 b 则返回 true 并且 true 意味着 a 将被放置在 b 之前”之类的东西,但显然这是不正确的

【问题讨论】:

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


【解决方案1】:

您可以随时查看文档。

来自priority_queue

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

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

然后,检查Compare

比较的概念是一些期望的一组要求 来自用户提供的函数对象的标准库设施 类型。

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

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

【讨论】:

  • 重要:对于priority_queue,顺序是比较器定义的顺序的反向。也就是说,当比较器为&lt; 时,调用pop() 将返回最大 元素。这就是优先队列的本质。 “正常”排序的容器遵循比较器定义的顺序。
【解决方案2】:

是的,如果你的功能是

bool operator(T a, T b); 

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

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

使用时,“最大”元素将位于队列的顶部。

【讨论】:

    【解决方案3】:

    &lt; 排序是惯例。你的代码

    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

    【讨论】:

      【解决方案4】:

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

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

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

      如果条件不成立,排序函数内部可能会使用两个值的简单交换。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多