在priority_queue中使用更大的比较器存储自定义类的指针

问题描述 投票:0回答:1

我有一个像这样的priority_queue,而不是使用less比较(priority_queue的默认值)。我想使用更大的<>。所以我像这样调整代码

priority_queue<EncodingNode*, vector<EncodingNode*>, greater<Comparator>> pq;

这是我的EncodingNode的定义

class EncodingNode
{
public:
    char c;
    int freq;
    int priority;
};

这是我的比较器类:

struct Comparator
{
    bool operator()(const EncodingNode* a, const EncodingNode* b);
};

bool Comparator::operator()(const EncodingNode* a, const EncodingNode* b)
{
    // logic for comparing two EncodingNode*
    if (a->freq > b->freq)
        return true;
    else if (a->freq == b->freq)
    {
        if (a->priority > b->priority)
            return true;
    }
    return false;
}

它一直给我这个错误:无法将参数 1 从 'EncodingNode *' 转换为 'const_Ty &' 无论如何,有没有办法解决这个问题,如果我删除代码的大部分,它会运行,但不使用更大的<>,我必须以某种方式否定比较器内的条件并给出错误的结果。在这种情况下是否可以使用更大的<>。非常感谢。

c++ comparator priority-queue
1个回答
1
投票

std::greater
(x, y)
转换为
x > y
,因为
Comparator
没有实现
>
运算符
greater<Comparator>
无法编译。在这种情况下你不需要
std::greater
,你只需直接传递比较器即可:

priority_queue<EncodingNode*, vector<EncodingNode*>, Comparator> pq;

请注意,您的比较器可以简化为:

bool Comparator::operator()(const EncodingNode* a, const EncodingNode* b)
{
    return std::tie(a->freq, a->priority) > std::tie(b->freq, b->priority);
}
© www.soinside.com 2019 - 2024. All rights reserved.