c++ - 霍夫曼编码的修改
问题描述
当我学习霍夫曼编码时,我在处理优先级队列时遇到了一个问题。由于我不太擅长 cpp 请帮助。
我试图做一些我迄今为止在 cpp 中学到的改变。在上面的 cpp 程序中,我更改了下面的部分代码
struct Node
{
char ch;
int freq;
Node *left, *right;
};
struct comp
{
bool operator()(Node* l, Node* r)
{
// highest priority item has lowest frequency
return l->freq > r->freq;
}
};
并将其用作功能priority_queue<Node*, vector<Node*>, comp> pq
。buidingHuffmanTree()
我把它改成
struct Node
{
char ch;
int freq;
Node *left, *right;
bool operator<(Node const& other) {
return freq < other.freq;
}
};
现在我试着像使用它一样
priority_queue<Node*, vector<Node*>> pq
但我得到了错误的答案。在上面的程序输入是静态的,你可以看到答案是准确的(输入输出很大,我不能在这里写)
还试图改变标志freq > other.freq
而不是<
得到错误的答案
由于两段代码的工作方式不同,我认为它们将以相同的方式工作。
解决方案
问题是您的队列存储指向对象的指针,Node
而不是实际的Node
对象实例本身。
该comp
结构使用其函数调用运算符处理它,但您的成员operator<
重载不处理指针。
更具体地说,对于成员运算符重载,左侧必须是对象实例(调用函数),而不是指针。
如果您不想使用仿函数对象而是想使用运算符重载,则可以创建一个以两个指针作为参数的非成员函数:
struct Node
{
char ch;
int freq;
Node *left, *right;
// By using `friend` we declare this as a non-member function
friend bool operator<(Node const* left, Node const* right)
return left->freq < right->freq;
}
};
推荐阅读
- python - 单元测试 Mock GCS
- java - 从源代码构建的 Elasticsearch 引发异常(任务:server:compileJava FAILED)
- ios - 单击时如何防止按钮动画
- sql-server - 如何在 SQL Server 中“使用”架构
- reactjs - React hooks 获取的数据不断链接到以前获取的数据
- javascript - 让 twitter bot 在新的关注操作 javascript 上检索用户名
- typescript - Azure 管道 task.exec 未按预期返回进程的退出代码,但会为非零退出代码捕获块
- c# - 我是否应该尽可能使用“in”参数修饰符?
- javascript - 使用 webView 的 Javascript 解析返回不同的结果
- python - 当我输入 python bot.py 命令不会执行