我试图实现自己的霍夫曼编码算法,并且C ++ STL的优先级队列似乎无法正常工作。我从字符串中获取字符并按字符串中频率的顺序将它们插入到优先级队列中。代码编译并运行没有错误,唯一的事情是树似乎没有正确排序。这是代码,
class Node {
public:
int freq;
char data;
Node(int &f, char &d) { freq=f; data=d; }
bool operator<(const Node* &n) const { return n->freq < this->freq; }
};
void Init(priority_queue<Node*> &tree, string input) {
map<char,int> probability;
for(int i=0 ; i<input.size() ; i++) {
probability[input[i]]++;
}
map<char,int>::iterator it = probability.begin();
for(it ; it != probability.end() ; it++) {
Node* blah = new Node(it->second, (char&) it->first);
tree.push(blah);
}
}
我做错了什么?
由于
答案 0 :(得分:8)
您正在priority_queue
中存储指针,因此元素按指针值排序,而不是使用operator<
重载。
您需要在优先级队列中存储Node
个对象,或者需要为优先级队列编写自定义比较函数,该队列取消引用存储的指针并比较它们指向的Node
个对象。
既然你问“我做错了什么?”,这里有一些其他建议:
operator<
重载应采用const引用,而不是对指针的引用。Node
构造函数应该按值获取其参数,或者至少使用const引用。演员(char&)it->first
并不好。让const
帮助你编写好的代码,不要反对它。Node
个对象直接存储在优先级队列中,而不是指针。using namespace std
;你应该删除它并在任何需要的地方拼出std::
。