自定义类传入priority_queue时第三个参数的用法

在用priority_queue时,我遇到了一些问题
(关于priority_queue的详细用法见C++优先队列)

定义:priority_queue<Type, Container, Functional>

Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆

写Huffman编码构造Huffman树时,我用到了优先队列:

class TreeNode {
private:
    char character;
    int weight;
    TreeNode*left;
    TreeNode*right;
public:
    TreeNode();
    TreeNode(char character, int weight);

    bool operator<(const TreeNode &rhs) const;
    bool operator>(const TreeNode &rhs) const;
    bool operator<=(const TreeNode &rhs) const;
    bool operator>=(const TreeNode &rhs) const;

    char getCharacter() const;
    int getWeight() const;
    TreeNode *getLeft() const;
    TreeNode *getRight() const;

    void setLeft(TreeNode *left);
    void setRight(TreeNode *right);
    void setWeight(int weight);
    void setCharacter(char character);
};

因为TreeNode类内我已经重载了比较运算符,因此在使用优先队列时我心安理得的直接把greater<TreeNode*>传了进去,即:

std::priority_queue<TreeNode*,std::vector<TreeNode*>,std::greater<TreeNode*>>priorityQueue;

预期这样写能够构造出一个根据TreeNode里以weight(权重)作比的最小堆

但事实上生成的Huffman树跟我预想的完全不一样,找了很久,才发现是这里出了问题。

其实这里传入的第三个参数根本没有起作用,因为我想定义的是TreeNode*类型的优先队列,但是我重载的比较运算符却是两个类对象的参数,因此编译器根本不知道两个类指针对象该怎么比,结果就是这个堆完全是随机生成的。

而重载运算符必须要求存在类对象,不能直接传入两个类指针参数比较,那该怎么办?
其实,第三个参数还有第二种用法,重写仿函数

struct cmp {
	bool operator()(TreeNode* a, TreeNode* b)const {
		return a->GetWeight() > b->GetWeight();
	}
};

自定义一个cmp类,作为第三个参数传入即可

priority_queue<TreeNode*, vector<TreeNode*>, cmp> queue;

(一个破问题浪费了两个小时)

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值