优先级队列未排序 我试图实现我自己的赫夫曼编码算法,而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); } 类节点{ 公众: 国际频率; 字符数据; 节点(int&f,char&d){freq=f;data=d;} 布尔运算符freqfreq;} }; void Init(优先级队列和树,字符串输入){ 地图概率; 对于(int i=0;等秒,(char&)it->first); 树。推(废话); }

优先级队列未排序 我试图实现我自己的赫夫曼编码算法,而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); } 类节点{ 公众: 国际频率; 字符数据; 节点(int&f,char&d){freq=f;data=d;} 布尔运算符freqfreq;} }; void Init(优先级队列和树,字符串输入){ 地图概率; 对于(int i=0;等秒,(char&)it->first); 树。推(废话); },c++,stl,C++,Stl,} 我做错了什么 谢谢您将指针存储在优先级队列中,因此元素是按指针值排序的,而不是使用运算符OK,因此我理解运算符使用常量引用,而不是指针引用,并使PQ take节点而不是指向节点的指针工作。剩下的呢?为什么构造函数应该按值获取参数,为什么我不应该使用“using namespace std”,为什么类型转换是为了摆脱const的坏习惯?@Zach:你不改变参数,那么为什么要像传递参数一样传递参数呢?如果你这么做了,你以后就不需要那个危险的演员了。为什么投法很危险?因为地图键不应该改变;如果您更

}

我做错了什么


谢谢

您将指针存储在
优先级队列中
,因此元素是按指针值排序的,而不是使用
运算符OK,因此我理解运算符使用常量引用,而不是指针引用,并使PQ take节点而不是指向节点的指针工作。剩下的呢?为什么构造函数应该按值获取参数,为什么我不应该使用“using namespace std”,为什么类型转换是为了摆脱const的坏习惯?@Zach:你不改变参数,那么为什么要像传递参数一样传递参数呢?如果你这么做了,你以后就不需要那个危险的演员了。为什么投法很危险?因为地图键不应该改变;如果您更改了一个,地图可能不再排序,现在您已经破坏了整个容器<代码>使用名称空间std
违背了将事物放入名称空间的全部目的。您已经引入了各种各样的机会,由于超负荷的解决方案,名称冲突,以及诸如此类的微妙的错误。